前言
所有操作基于kibana的 devs tools,相关的安装可以看:
【ES学习】ElasticSearch MacOS版 安装与使用(图文教程)
【ES学习】ElasticSearch在Kibana的使用 Kibana安装(MacOS版)
本文承接【ES】Elasticsearch的基本操作及相关概念-01
本文承接【ES】Elasticsearch的基本操作及相关概念-02
先导入更多的数据:
PUT /megacorp/employee/5
{
"first_name" : "Hone",
"last_name" : "Xiao",
"age" : 40,
"about" : "I graduated from the Cambridge",
"interests": [ "photography", "hiking"]
}
PUT /megacorp/employee/6
{
"first_name" : "Qiang",
"last_name" : "Xiao",
"age" : 29,
"about" : "I have research on computers",
"interests": [ "hiking", "music"]
}
PUT /megacorp/employee/7
{
"first_name" : "Bei",
"last_name" : "Bei",
"age" : 27,
"about" : "I am good at playing piano",
"interests": [ "photography", "sports"]
}
PUT /megacorp/employee/8
{
"first_name" : "Ge",
"last_name" : "Feng",
"age" : 38,
"about" : "I am an investor in MCN",
"interests": [ "diving", "alpinism"]
}
PUT /megacorp/employee/9
{
"first_name" : "Jie",
"last_name" : "G",
"age" : 38,
"about" : "I am a part-time model and anchor",
"interests": [ "diving", "reading"]
}
PUT /megacorp/employee/10
{
"first_name" : "Liya",
"last_name" : "Jie",
"age" : 27,
"about" : "I like dancing and music",
"interests": [ "music", "dancing"]
}
复制代码
from-size 分页查询
这就像极了MySQL中的LIMIT a, b,ES中也可以通过规定起始位置和展示数量,来达到分页搜索的效果。
我们可以输入:
=========== 表达式 =========
GET /索引index/类型types/_search
{
"from": 起始位置,
"size": 页面size
}
==========================
GET /megacorp/employee/_search
{
"from": 0,
"size": 5
}
复制代码
结果会显示5条文档,并且从第0个开始。
我们再输入:
GET /megacorp/employee/_search
{
"from": 5,
"size": 5
}
复制代码
也会显示5条文档,但是是从第5条文档开始。
如果from+size超过index.max_result_window(默认10000),会报错
数据分片存储下,如果"from":"400","size":"10",那就需要在每一个分片上,处理400+10=410条数据,再聚合各个分片上的410条结果取前10条数据再返回。所以,页数越深,处理的文档就越多,占用的堆内存也就越大,耗时越长,效率越低。
scroll 分页查询
scroll通过生成快照的方式避免深度分页问题。
我们需要先scroll search:
GET /megacorp/employee/_search?scroll=10m
{
"size" : 5,
"query": {
"fuzzy": {
"about": "to"
}
}
}
复制代码
记住scroll_id,我们输入:
POST _search/scroll
{
"scroll" : "10m",
"scroll_id" : "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFjl6OVRkQkI1UklTNElVU1VDVjJnOVEAAAAAAAAHtBZjX1o2MklfOVJWcWRhR2F1QXpjUnB3"
}
复制代码
可以看出scroll并不是实时性的。
search_after 向下翻页
search_after可以做实时搜索。需要先进行正常的搜索,要指定sort值,并且值要唯一。然后使用之前获取到的sort值进行search_after:
我们先输入sort语句查询,按照"age"降序(sort可以多条件,我们只给单条件":
GET /megacorp/employee/_search
{
"size" : 3,
"query": {
"fuzzy": {
"about": "to"
}
},
"sort" : [
{
"age" : "desc"
}
]
}
复制代码
得到:
{
"took" : 34,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 3,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "3",
"_score" : null,
"_source" : {
"first_name" : "Douglas",
"last_name" : "Fir",
"age" : 35,
"about" : "I like to build cabinets",
"interests" : [
"forestry"
]
},
"sort" : [
35
]
},
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "2",
"_score" : null,
"_source" : {
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests" : [
"music"
]
},
"sort" : [
32
]
},
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "1",
"_score" : null,
"_source" : {
"first_name" : "John",
"last_name" : "Smith",
"age" : 25,
"about" : "I love to go rock climbing",
"interests" : [
"sports",
"music"
]
},
"sort" : [
25
]
}
]
}
复制代码
然后我们输入:
GET /megacorp/employee/_search
{
"size" : 3,
"search_after": [35],
"sort" : [
{
"age" : "desc"
}
]
}
复制代码
得到:
{
"took" : 7,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 10,
"relation" : "eq"
},
"max_score" : null,
"hits" : [
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "2",
"_score" : null,
"_source" : {
"first_name" : "Jane",
"last_name" : "Smith",
"age" : 32,
"about" : "I like to collect rock albums",
"interests" : [
"music"
]
},
"sort" : [
32
]
},
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "6",
"_score" : null,
"_source" : {
"first_name" : "Qiang",
"last_name" : "Xiao",
"age" : 29,
"about" : "I have research on computers",
"interests" : [
"hiking",
"music"
]
},
"sort" : [
29
]
},
{
"_index" : "megacorp",
"_type" : "employee",
"_id" : "7",
"_score" : null,
"_source" : {
"first_name" : "Bei",
"last_name" : "Bei",
"age" : 27,
"about" : "I am good at playing piano",
"interests" : [
"photography",
"sports"
]
},
"sort" : [
27
]
}
]
}
}
复制代码
count 命中数量
count可以计算搜索到结果的数量。
我们输入:
GET /megacorp/employee/_count
{
"query": {
"fuzzy": {
"about": "to"
}
}
}
复制代码
可以得到:
{
"count" : 3,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
}
}
复制代码
还可以多个索引index查找
GET megacorp,blogs/_count
{
"query": {
"fuzzy": {
"about": "to"
}
}
}
复制代码
HEAD 判断存在
我们可以使用HEAD命令来判断索引是否存在:
HEAD /megacorp
复制代码
返回200是存在。 返回404是不存在。
_close / _open 关闭/开启索引
索引关闭会消耗大量的磁盘空间。
我们输入:
POST /megacorp/_close
复制代码
可以将索引关闭,如下:
{
"acknowledged" : true,
"shards_acknowledged" : true,
"indices" : {
"megacorp" : {
"closed" : true
}
}
}
复制代码
此时索引搜东西是搜不了的。
我们再通过_open开启索引:
POST /megacorp/_open
复制代码
_rollover 滚动索引
1)滚动索引是设置索引,而非创建索引,且设置一次结果返回 “rolled_over” : true,则会按照设定规则创建新索引,名字递增,而非一次设置永久有效。
2)注意点2:设置滚动索引会出现两个别名,一个读取别名(在模板中定义),一个写入别名(在创建index中指定)
滚动索引的作用防止索引过大或过旧时,滚动索引API会将别名滚动到新的索引。别名指向到新的索引后,旧的索引就无法查询到。
我们输入:
PUT /logs-000001
{
"aliases": {
"logs_write": {}
}
}
复制代码
用_rollover并指定条件:创建时间大于7天或者文档数大于1000,将发生滚动操作,并生成新的索引logs-000002而且别名也指向新的索引。我们输入:
POST /logs_write/_rollover
{
"conditions": {
"max_age": "7d",
"max_docs": 1000
}
}
复制代码
_mapping 索引结构查询
Mapping就是索引结构,可以看做是数据库中的表结构,包括字段名、字段类型、倒排索引相关设置。
我们输入:
GET /_mapping
复制代码
会显示我们曾经创建过的所有索引的结构。
我们输入:
GET /megacorp/_mapping
复制代码
可以得到megacorp索引的结构:
_aliases 索引指定别名
我们创建一个新索引:
PUT /source_name
复制代码
然后输入:
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "索引名字", "alias" : "索引别名" } }
]
}
============================================
POST /_aliases
{
"actions" : [
{ "add" : { "index" : "source_name", "alias" : "other_name" } }
]
}
复制代码
这样我们GET 这两个索引名字,指向的都是同一个:
注意:这里的"actions"是原子操作。
_stats 索引统计信息
查看索引统计状态,我们输入:
GET /megacorp/_stats
复制代码
我的得到:
{
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_all" : {
"primaries" : {
"docs" : {
"count" : 10,
"deleted" : 1
},
"store" : {
.......
},
"indexing" : {
.......
},
"get" : {
.......
},
"search" : {
.......
},
"merges" : {
.......
},
"refresh" : {
.......
},
"flush" : {
.......
},
"warmer" : {
.......
},
"query_cache" : {
.......
},
"fielddata" : {
.......
},
"completion" : {
"size_in_bytes" : 0
},
"segments" : {
........
},
"translog" : {
........
},
"request_cache" : {
........
},
"recovery" : {
.........
}
},
.......
复制代码
primaries:主分区的统计结果。
total:主分区和副本统计结果。
各个字段的含义: docs:所有文档的个数和删除的文档个数。
store:占用的存储的字节数.。
indexing:文档级别的统计。
search :query统计。
segments :内存分片。
completion : fielddata:字段空间统计。 flush :刷新到磁盘统计。 merge :合并统计。 request_cache:缓存命中统计。 refresh :刷新到可以被查询到统计(有可能还有flush到磁盘)。 translog :translog 统计。 segments:获取segments信息,索引信息在segments层级的情况 indices recovery:获取索引恢复的情况。
_settings 索引设置信息
我们输入:
GET /megacorp/_settings
复制代码
可以得到:
{
"megacorp" : {
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "megacorp",
"creation_date" : "1629699262885",
"number_of_replicas" : "1",
"uuid" : "5skqj50KQf-eUSH0JUwIUA",
"version" : {
"created" : "7140099"
}
}
}
}
}
复制代码
_cache-clear 清除缓存
我们输入:
POST /megacorp/_cache/clear
复制代码
可以清除缓存
_flush 刷新数据到磁盘
_flush可以刷新数据到磁盘上,释放内存空间:
POST /megacorp/_flush
复制代码