欢迎访问我的博客,你的支持,是我最大的动力!

elasticsearch技术解析与实战(三) 搜索

ELK Stack 小马奔腾 8883℃ 评论
目录:
[显示]

搜索语法和查询专用语言DSL

深入搜索

搜索方式

两种方式,一种是通过URL参数进行搜索,另一种是通过POST请求参数进行搜索

URL参数搜索

请求:GET http://127.0.0.1:9200/secisland/log/_search?参数,多个参数用&分开

GET secisland/_search?q=GET
GET secisland/_search?q=get&explain
GET secisland/_search?q=get&_source=false&fields=method,input
GET secisland/_search?q=get&_source=false&fields=method,input&sort=input:asc
GET secisland/_search?q=get&_source=false&fields=method,input&sort=input:asc&size=2
POST请求参数搜索
请求:POST http://127.0.0.1:9200/secisland/doc/_search
参数:JSON格式的查询语法DSL 如:{"query":{"term":{"type":"www_log"}}}
如果需要分页,可以通过from size组合来进行,from表示从第几行开始,size表示查询多少条文档,from默认为0,size默认为10
size大小不能超过index.max_result_window参数的设置,默认为10000
POST secisland/doc/_search {"from":0,"size":10,"query":{"term":{"type":"www_log"}}}
排序sort
#优先对type字段进行排序,然后对agent字段进行排序
{"query":{"term":{"type":"www_log"}},"sort":[{"type.raw":"asc"},{"agent.raw":"desc"}]}
注意,分析字段不能进行排序,所以需要使用关键字字段type.raw和agent.raw
当一个字段的内容有多个值时,系统支持min/max/sum/avg/median计算排序
#若order有多个值,取平均值排序
{"query":{...},"sort":[{"price":{"order":"asc","mode":"avg"}}]}
数据列过滤
在查询时不显示原始数据,或者显示部分原始字段
#不显示原始字段
POST secisland/_search {"_source":false,"query":{"term":{"type":"www_log"}}}
#显示部分原始字段
POST secisland/_search {"_source":["s*"],"query":{"term":{"type":"www_log"}}}
#包含或排除某些列
POST secisland/_search {"_source":{"include":["i*"],"exclude":["*e"]},"query":{"term":{"type":"www_log"}}}
脚本支持

POST secisland/_search {"query":{"term":{"type":"www_log"}},"script_fields":{"test1":{"script":"doc['input'].value*2000"}}}

重新评分
在es中,搜索单个单词是比较快的,搜索短语时,效率会比较低,重新评分可以提高查询短语的效率。原理是当在整个索引中搜索短语的资源消耗会比较多,但大多数时候,人们只关心最近发生的一部分文档,可以在最近的一段文档中对短语进行重新评分,在查询时,看起来效率会比较高
当查询在有排序sort或者search_type设置为scan、count时将不执行重新评分。
使用分页查询时,每一页查询的window_size参数尽量不要修改,修改后可能引起排序混乱,导致不可预知结果
查询评分只会在query和post_filter阶段返回的K条结果上执行二次查询,在每个分片返回文档的数量由window_size控制,默认返回from到size之间的个数
默认文档最终得分_score是原始得分和重新评分后进行的线性组合,原始评分和重新评分的比例关系分布由query_weight和rescore_query_weith控制,默认都为1
POST secisland/_search {"query":{"match":{"field1":{"operator":"or","query":"api/entry/getInfo","type":"boolean"}}},"rescore":{"window_size":50,"query":{"rescore_query":{"match":{"filed1":{"query":"api/entry/getInfo","type":"phrase","slop":2}}},"query_weight":0.7,"rescore_query_weight":1.2}}}
分数相结合的方式可以用score_mode控制,其参数如下:
total,原始分数和重新评分分值相加,默认
multiply,原始分数和重新评分分值相乘,对于用函数方式重新评分的时候比较有用
avg,分值进行平均
max,分值中取最大值
min,分值中取最小值
系统也支持顺序执行多个重新评分查询,如:
POST secisland/_search {"query":{"match":{"field1":{"operator":"or","query":"the quick brown","type":"boolean"}}},"rescore":[{"window_size":100,"query":{"rescore_query":{"match":{"field1":{"query":"the quick brown","type":"phrase","slop":2}}},"query_weight":0.7,"rescore_query_weight":1.2}},{"window_size":10,"query":{"score_mode":"multiply","rescore_query":{"function_score":{"script_score":{"script":"log10(doc['numeric'].value+2)"}}}}}]}
#先是第一个得到评分的结果,然后在第一次评分的结果上再次评分,第二次评分参考第一次评分的排序结果,所以它可以用在第一次生新评分结果比较多的情况下利用第二次评分得到一个较小的结果文档
滚动查询请求

es中,一次查询只能得到一次独立的结果,在分页中这很不方便。分页时,第n页查询时,实际查询了所有的结果,只是返回时抛弃了前面n-1页的结果
滚动查询类似于数据库中的游标

滚动查询请求的原理
滚动不适合实时用户请求,适合处理比较多的数据,如为了重建一个索引到一个新的索引中
从scroll请求返回的结果反映的是查询时的索引状态,类似一个快照,后续对文档的改动只会影响后面的搜索请求
POST secisland/doc/_search?scroll=1m&pretty {"query":{"term":{"method":"post"}}}
保持时间的参数如下:
y,年  M,月 w,周 d,天 h,小时 m,分钟 s,秒
返回结果中包含一个scroll_id,可将该ID传递给scroll API来搜索下一个批次的内容,实例如下:
POST secisland/doc/_search/scroll?pretty {"scroll":"1m","scroll_id":"cXVlcnlUaGVuRmV0Y2g7NTs2MTUyMjI6MGJGWkZJVXFSZHFPOXpxdG1yUWprZzs2MTUyMjM6MGJGWkZJVXFSZHFPOXpxdG1yUWprZzs2MTUyMjQ6MGJGWkZJVXFSZHFPOXpxdG1yUWprZzs2MTUyMjU6MGJGWkZJVXFSZHFPOXpxdG1yUWprZzs2MTUyMjY6MGJGWkZJVXFSZHFPOXpxdG1yUWprZzswOw=="}
每一次调用scroll查询返回下一批的结果,直到返回为空("hits":[]),表示查询完成
第一次搜索请求和每个后续滚动请求返回一个新的_scroll_id,只有最新的_scroll_id才能使用
如果请求指定了聚合aggregation,只有第一次搜索的返回结果才会包含聚合结果
当使用_doc排序查询时,滚动的效率是最高的,当希望遍历所有文档且无顺序要求时,这是最高效的方式
POST _search?scroll=1m {"sort":["_doc"]}

搜索的时效性
scroll参数告诉es应保持多长时间的搜索。这个值并不需要长到可以处理所有数据,只要够处理前一批次结果的时间,每次滚动请求会设置一个新的有效时间
合并过程优化的背景是通过全并小段来创建一个新的大段来优化索引,然后删除小段
可以通过stats API检查打开了多少搜索上下文
GET _nodes/stats/indices/search?pretty
当滚动超时时会自动删除搜索上下文,然而保持滚动打开会产生成本,所以当scroll不再被使用时,需要用slear-scroll显式清除滚动接口
DELETE _search/scroll/_all  #清除所有

隐藏内容查询
es中有嵌套结构和父子结构,在父子结构中,可以通过查询子文档的内容返回父文档的内容或者通过父文档查询返回子文档;在嵌套结构中,可以通过嵌套内部对象的查询得到嵌套文档
上面两种情况中,实际匹配内容是隐藏的,如果需要展现实际匹配内容,可以使用隐藏内容查询inner hits
#嵌套结构
PUT secilog {"mappings":{"weblog":{"properties":{"message":{"type":"string","index":"analyzed"},"apache":{"type":"nested","properties":{"method":{"type":"string","index":"not_analyzed"},"status":{"type":"string","index":"not_analyzed"}}}}}}}
#插入数据
PUT secilog/weblog/1 {"message":"58.240.83.67 - - [16/Feb/2018:12:58:47 +0800] \"POST /copyreght/check HTTP/1.1 \" 200 2","apache":[{"method":"POST","status":"200"}]}
#查询
POST secilog/weblog/_search {"query":{"nested":{"path":"apache","query":{"bool":{"must":[{"term":{"apache.method":"POST"}}]}}}}}
POST secilog/weblog/_search {"query":{"nested":{"path":"apache","query":{"bool":{"must":[{"term":{"apache.method":"POST"}}]}},"inner_hits":{"from":0,"size":10}}}}
inner_hits支持的参数
from,搜索命中的开始位置
size,搜索的文档条数
sort,排序字段
name,响应中用于特殊内部命中定义的名称,在一个搜索中定义多个内部隐藏查询时比较有用
搜索相关函数
Preference
搜索分片副本执行偏好设置。默认使用随机副本方法搜索副本的分片。可以通过preference参数设置搜索分片范围
POST /secilog/_search?_primary {"query":{"match":{"message":"POST"}}}
这个值也可以是自定义的值,用来保证同样的分片将使用相同的自定义值,这个值可以是网络会话标识/用户名称
POST /secilog/_search?preference=xyzabc123
通过"version":true可以使每个返回的结果之中有版本号
{"version":true,"query":{"term":{"message":"POST"}}}index_boost索引加权
当搜索多个索引时,可以对每个索引配置不同的索引加权级别。当多个索引存储类似文档时,索引加权特别有用,可以使一个索引命中级别高于另一个索引
{"indices_boost":{"index1":1.4,"index2":1.3}}min_score最小分值
可以指定搜索时的最小评分分值
{"min_score":0.5,"query":{"term":{"message":"POST"}}}explain分值解释
使每个命中的查询解释它的得分是如何计算出来的
{"explain":true,"query":{"term":{"method":"post"}}}_search_shards分片情况查询
GET secisland/_search_shards_count总数查询
GET secisland/_count
POST secisland/_count {"explain":true,"query":{"term":{"method":"post"}}}是否存在查询
当设置size为0和terminate_after为1时,可以验证查询是否有结果存在
POST secisland/_search {"size":0,"terminate_after":1,"query":{"term":{"method":"post"}}}验证接口
验证一个查询的语法是否正确,这样可以不实际执行,提高效率,防止误操作
POST secisland/_validate/query {"query":{"term":{"method":"post"}}}字段状态查询
_field_stats可以对索引字段状态进行查询
GET secisland/_field_stats?fields=times
搜索模板
es支持基于模板的查询,可以使用mustache语言作为搜索请求的预处理,它提供模板,通过键值对替换模板中的变量。
模板的使用方式:
直接在请求体中使用脚本
把脚本存储在索引中,通过引用脚本id来使用
把脚本存储在本地磁盘中,默认位置:elasticsearch/config/scripts,通过引用脚本名称进行使用
PUT secilog/log/1 {"eventCount":1,"eventName":"linux login event"}
#第一种方式:请求中
POST secilog/_search {"query":{"template":{"inline":{"match":{"eventName":"{{query_string}}"}},"params":{"query_string":"linux"}}}}
#第二种方式:索引中
#先存储脚本
POST _search/template/templateTest {"template":{"query":{"match":{"eventName":"{{query_string}}"}}}}
存储后,get查询模板 delete删除模板 通过脚本id进行文档操作
POST secilog/_search {"query":{"template":{"id":"templateTest","params":{"query_string":"linux"}}}}
#第三种方式:文件中
cat elasticsearch-2.4.5/config/scripts/template_test.mustache
{
"template":{
"query":{
"match":{"eventName":"{{query_string}}"}
}
}
}
POST secilog/_search {"query":{"template":{"id":"template_test","params":{"query_string":"linux"}}}}  #报错找不到脚本?
模板验证
POST _render/template {"inline":{"query":{"match":{"{{my_field}}":"{{my_value}}"}},"size":"{{my_size}}"},"params":{"my_fiele":"foo","my_value":"bar","my_size":5}}
查询DSL
查询和过滤的区别
叶查询子句:在特定字段上查找特定的值,如match、term或者range查询
复合查询子句:包含其它叶查询或复合查询子句,以合理的方式结合多条查询,如bool、dis_max 或者改变查询行为,如not、constant_score查询
查询:query,检查内容与条件是否匹配,且计算_score元字段表示匹配度。
过滤:filter,不计算匹配得分,只是简单地决定文档是否匹配。主要用于过滤结构化数据,如时间段 status字段值是否为"published"等使用过滤通常会被es自动缓存以提高性能
查询子句也可以传递filter参数,如bool查询内的filter/constant_score查询内的filter参数等POST secisland/_search {"query":{"bool":{"must":[{"match":{"query":"entry getinfo"}},{"match":{"method":"post"}}],"filter":[{"term":{"input_type":"log"}},{"range":{"timestamp":{"gte":"2018-01-01"}}}]}}}
#query字段包含单词entry getinfo;method字段包含单词post
#input_type字段为log;timstamp字段时间大于2018-01-01
#query参数表示内容查询,使用bool和match子句,用于计算每个文档的匹配得分
#filter参数表示内容过滤,使用term和range子句,过滤掉不匹配的文档、不影响文档匹配得分{"match_all":{}} 匹配所有文档 文档_score值为1.0
{"match_all":{"boost":1.2}} 使用boost修改_score值
全文搜索

执行查询前,根据被查询字段的分词方式,在查询字符串上应用被查询字段的映射分词器或搜索分词器
标准查询,授受文本、数字、日期的查询,分析参数并组成查询条件,如:{"match":{"message":"this is a test"}},其中message为字段我,也可以为_all
三种类型的match查询:布尔boolean/短语phrase/短语前缀phrase_prefix。此外还有多段查询、Lucene语法查询、简化查询

1、布尔查询
默认的标准查询类型,分析文本并组成一个布尔查询。operator参数可以设置为or(默认)或者and来控制布尔子句
用于匹配的should子句(可选)的最小数量可以使用minimun_should_match参数来设置
可以设置analyzer来控制在文本上执行分析过程的分析器,默认是字段映射中明确定义或者默认的搜索分词器
lenient参数可以设置为true来忽略数据类型匹配出错造成的异常,默认为false
(1)模糊匹配
fuzziness可以对请求的字段类型进行模糊匹配
prefix_length和max_expansions在这种情况下可以用来控制模糊过程。如果设置模糊选项,查询会使用top_terms_blended_freqs_${max_expansions}作为重写方法。fuzzy_rewrite参数可以控制查询如何进行重写
{"match":{"message":{"query":"this is a test","operator":"and"}}}
(2)零索引词查询
如果查询使用的分词器移除所有语元,默认行为是不匹配任何文档,可以使用zero_terms_query选项进行修改,接受none(默认)和all(相当于match_all)
{"match":{"message":{"query":"to bo or not to be","operator":"and","zero_terms_query":"all"}}}

2、短语查询
短语查询分析文本且创建短语查询
{"match_phrase":{"message":"this is a test"}}
因为短语查询只是标准查询的一个类型,所以上面的查询等价于:
{"match":{"message":{"query":"this is a test","type":"phrase"}}}
短语查询根据一个可配置的slop(默认为0)匹配索引词
可以设置analyzer控制在文本上执行的分词器,默认是字段映射中定义的分析器,或者是默认的搜索分析器
{"match_prase":{"message":{"query":"this is a test","analyzer":"my_analyzer"}}}

3、短语前缀查询
可以对文本最后一个字段进行前缀匹配
{"match_phrase_prefix":{"message":"this is a test"}}
等价于下面的方式:
{"match":{"message":{"query":"this is a test","type":"phrase_prefix"}}}
短语前缀查询接受和短语查询相同的参数
短语前缀查询接受max_expansions参数,以控制最后索引词会扩展多少前缀。推荐设置为一个可以接受的值来控制查询的执行时间,如
{"match_phrase_prefix":{"message":{"query":"this is a test","max_expansions":10}}}

4、多字段查询
在标准查询基础上,支持多字段查询,查询指定的字段(多个字段)
{"multi_match":{"query":"this is a test","fields":["subject","message"]}}
字段支持通配符
{"multi_match":{"query":"Will Smith","fields":["title","*_name"]}}
个别字段可以用caret(^)符号加权
{"multi_match":{"query":"this is a test","fields":["subject^3","message"]}} #subject比message字段重要三倍!

多字段查询内部执行方式由type参数决定,其值如下:
best_fields,默认,查找匹配任何字段的文档,但是使用最佳匹配字段的_score
most_fields,查找匹配任何字段的文档,结合每个字段的_score
cross_fields,用相同的分析器处理字段,将这些字段做为一个大字段,查找任何字段的每个单词
phrase,在每个字段上运行短语匹配查询,结合每个字段的_score
phrase_prefix,在每个字段上运行短语前缀查询,结合每个字段的_score

(1)best_fields
同一个字段中搜索多个单词时最有用。如,一个字段包含"brown fox"比包含"brown"或者"fox"更有意义
best_fields类型对每个字段生成一个匹配查询并封装成dis_max查询来找到最佳匹配字段,如
{"multi_match":{"query":"brown fox","type":"best_fields","fields":["subject","message"],"tie_breaker":0.3}} 会执行为:
{"dis_max":{"queries":[{"match":{"subject":"brown fox"}},{"match":{"message":"brown fox"}}],"tie_breaker":0.3}}
通常,best_fields使用最佳匹配字段得分,但如果指定了tie_breaker,可以通过最佳匹配字段的得分来计算匹配得分。
接受的参数有:analyzer、boost、operator、minimum_should_match、fuzziness、prefix_length、max_expansions、rewrite、zero_terms_query、cutoff_frequency。其中minimum_should_match参数可能值见下表:

(2)most_fields
当查询多字段包含相同文本以不同方式分词时最有用。如,主字段包含同义词、词根和不区分大小写的索引词;第二个字段包含原始的索引词;第三个字段可以包含单个索引词。通过结合所有三个字段的得分可以通过主字段匹配尽可能多的文档,通过第二个和第三个字段把最相近的结果推到列表顶端
{"multi_match":{"query":"quick brown fox","type":"most_fields","fields":["title","title.original","title.shingles"]}} 会执行为:
{"bool":{"should":[{"match":{"title":"quick brown fox"}},{"match":{"title.original":"quick brown fox"}},{"match":{"title.shingles":"quick brown fox"}}]}}
最终的匹配得分是将每个匹配子句的得分加在一块,然后除以匹配子句的数量
接受的参数有:analyzer、boost、opertor、minimum_should_match、fuzziness、prefix_length、max_exansions、rewrite、zero_terms_query、cutoff_frequency

(3)cross_fields
当结构化的文档中多个字段应该匹配时,此参数特别有用。如,通过first_name和last_name字段查询"Will Smith"时,最佳的匹配是"Will"在一个字段,"Smith"在另一个字段
一种处理这种查询的方法是将first_name和last_name索引到一个full_name字段,这需要在索引时完成
cross_fields类型在查询时通过term-centric方法,先将查询字符串分词为单独的索引词,然后在任一字段中查找每个索引词
{"multi_match":{"query":"Will Smith","type":"cross_fields","fields":["first_name","last_name"],"operator":"and"}}
接受的参数有:analyzer、boost、operator、minimum_should_match、zero_terms_query、cutoff_frequency

(4)phrase和phrase_prefix
短语和短语前缀类型和best_fields一样,只不过使用的是match_phrase查询或match_prase_prefix查询而不是match查询
{"multi_match":{"query":"quick brown f","type":"phrase_prefix","fields":["subject","message"]}} 会执行为:
{"dis_max":{"queries":[{"match_phrase_prefix":{"subject":"quick brown f"}},{"match_phrase_prefix":{"message":"quick brown f"}}]}}
接受的参数:analyzer、boost、slop、zero_terms_query。此外,短语前缀类型接受max_expansions

(5)cross_field和分词器
cross_field只能工作在使用相同分词器的term-centric模式字段,具有相同分词器的字段被分在一组,如果有多个分组,会通过bool查询结合在一起
#first、last分词器相同,first.edge、last.edge使用edge_ngram分析器
{"multi_match":{"query":"Jon","type":"cross_fields","fields":["first","first.edge","last","last.edge"]}}
first和last会被组在一起作为单独的字段,first.edge和last.edge会组成一个单独的字段
可以重写查询通过bool来实现,对其中一个应用minimum_should_match参数
{"bool":{"should":[{"multi_match":{"query":"Will Smith","type":"cross_fields","fields":["first","last"],"minimum_should_match":"50%"}},{"multi_match":{"query":"Will Smith","type":"cross_fields","fields":["*.edge"]}}]}}
也可以强迫所有字段到相同的分组,方法是在查询中指定analyer参数
{"multi_match":{"query":"Jon","type":"cross_fields","analyzer":"standard","fields":["first","last","*.edge"]}}

5、Lucene语法查询
使用语法分析器来分析内容进行查询
{"query_string":{"default_field":"content","query":"this AND OR thus"}}
query_string为最高级别,查询字符串参数见下表:

(1)默认字段
若在查询语法中没有明确指出查询的字段,会按index.query.default_field提供的字段,默认为_all字段
(2)多字段
query_string查询可以在多个字段上执行,可以通过fields参数定义
多字段执行query_string查询的意义在于利用OR子句扩展每个查询索引词,形如:
field1:query_term OR field2:query_term ...
{"query_string":{"fields":["content","name"],"query":"this AND that"}}
实际匹配形式为:
{"query_string":{"query":"(content:this OR name:this) AND (content:that OR name:that)"}}
(3)语法
查询字符串被解析为一系列字段和运算符,字段可以是一个单词或者短语(搜索短语中的所有单词,以相同的顺序用双引号包起来)
可用选项有:
1)字段名,可以指定default_field之外的其他字段
#status字段包含active
status:active
#title字段包含quick或brown
title:(quick OR brown)
title:(quick brown)
#author字段包含短语"John Smith"
author:"John Smith"
#任何book.title、book.content或book.date字段包含quick或brown (注意:需要反斜线转义*)
book.\*:(quick brown)
#title字段不包含(或者缺失)值
_missing_:title
#title字段非空
_exists_:title
2)通配符,?代替单个字符,*代替零个或者多个字符
qu?ck bro*
3)正则表达式,通过斜线包围,正则表达式可以植入到查询字符串中
name:/joh?n(ath[oa]n)/
4)模糊化
quikc-1
5)邻近搜索,可以指定短语中单词的最大编辑距离
"fox quick"-5
字段中的文本越接近于查询字符串的顺序,文档的相关性越高,短语"quick fox"相似性高于"quick brown fox"
6)范围,日期、数字或字符串字段的范围,包含的范围用方括号指定[min TO max],不包含的范围用花括号指定{min TO max}
#2018年所有日期
date:[2018-01-01 TO 2018-12-31]
#数字1到5
count:[1 TO 5]
#alpha和omega之间的标签,不包含alpah和omega
tag:{alpha TO omega}
#大于等于10的数
count:[10 to *]
#2018年以前的日期
date:{* TO 2018-01-01}
#大于等于1小于5的数
count:[1 TO 5}
#一边值为无限
age:>10  age:>=10  age:<10  age:<=10
7)增权
quick^2 fox
"john smith"^2
(foo bar)^4
8)布尔操作符
+ 必须包含
-  必须不包含
支持AND/OR和NOT,也可以写作&&/||和!操作符
((quick AND fox) OR (brown AND fox) OR fox) AND NOT news
上面表达式等同于:
{"bool":{"must":{"match":"fox"},"should":{"match":"quick brown"},"must_not":{"match":"news"}}}
9)分组,多字段或子句可以使用圆括号进行分组
status:(active OR pending) title:(full text search)^2
10)保留字符,查询中出现保留字符时,需要进行转义
\(1\+1\)\=2
保留字符有:+-=&&||<>!()[]{}^"~?:\/
11)空查询,如果查询字符串为空或仅包含空格时,查询会生成一个空结果集

6、简化查询
简化语法,简化查询不会抛出异常,且会丢弃查询无效部分
{"simple_query_string":{"query":"\"fried eggs\" +(eggplant | potato) -frittata","analyzer":"snowball","fields":["body^5","_all"],"default_operator":"and"}}
简化查询可以接受的参数列表:

1)语法
简单查询字符串支持的特殊字符如下:

+ 表示AND运算符
| 表示OR运算符
- 排除一个词元
" 包含一批词元来指定搜索短语
* 在索引词结尾表示前缀查询
() 表示优先
~N 在单词的后面,表示编辑距离(模糊性)
~N 在短语的后面,表示溢出量

为搜索任何这些特殊字符,需要使用斜线\
2)默认字段
在搜索字符串语法中没有明确指出需要搜索的字段时,index.query.default_field的值用为搜索字段,默认为_all字段
3)多字段
字段参数可以包括基于模式的字段名,可以自动扩展相关字段
{"simple_query_string":{"fields":["content":"name.*^5"],"query":"foo bar baz"}}
4)标记
简单查询字符串支持多个标记来指定需要启用的解析功能,flags参数指定,用|分隔
{"simple_query_string":{"query":"foo | bar + baz*","flags":"OR|AND|PREFIX"}
可用的标记有:ALL、NONE、AND、OR、NOT、PREFIX、PHRASE、PRECEDENCE、ESCAPE、WHITESPACE、FUZZY、NEAR和SLOP

字段查询

 

全文查询执行前会分析查询字符串,而字段查询会进行精确查询
常用于结构化数据,如数字/日期和枚举

1、单字段查询
查询指定字段中指定内容
{"term":{"user":"Kimchy"}}
{"query":{"term":{"method":"post"}}} 实际查询语句 {"filter":{"term":{"method":"post"}}}实际过滤

2、多字段查询
过滤文档,文档字段匹配任何提供的索引词(不分词)
{"constant_score":{"filter":{"terms":{"user":["kimchy","elasticsearch"]}}}}

3、范围查询
查找某一范围内的内容
Lucene查询类型取决于字段类型,对字符串类型字段,使用TermRangeQuery;对于数字/日期类型字段,使用NumericRangeQuery
{"range":{"age":{"gte":10,"lte":20,"boost":2.0}}}
gte:大于或等于
gt:大于
lte:小于或等于
lt:小于
boost:查询加权值,默认为1

1)日期型字段的范围
可以使用名为日期匹配的分段来指定范围
{"range":{"date":{"gte":"now-1d/d","lt":"now/d"}}}
日期匹配和取整:凑整日期到最近的月、日、小时等,凑整的日期取决于是否包含日期范围的结尾,向上舍入范围的最后毫秒数,向下舍入范围的第一个毫秒数
gt:大于日期向上舍入,2018-01-10||/M成为2018-01-31T23:59:59.999,不包含整个月
gte:大于或等于日期向下舍入,2018-01-10||/M成为2018-01-01,包含整个月
lt:小于日期向下舍入,2018-01-10||/M成为2018-01-01,不包含整个月
lte:小于或等于日期向上舍入,2018-01-10||/M成为2018-01-31T23:59:59.999,包含整个月
范围查询的日期格式:可以通过传递format参数到范围查询中来重写日期格式
{"range":{"born":{"gte":"01/01/2012","lte":"2013","format":"dd/MM/yyyy||yyyy}}}
范围查询的时区:在日期值里指定时区(如果格式接受时区)或者在time_zone参数中指定时区,日期可以从其他时区转换到世界标准时间
{"range":{"timestamp":{"gte":"2015-01-01 00:00:00","lte":"now","time_zone":"+01:00"}}}
#日期将被转换为2014-12-31T23:00:00 UTC,now不会受time_zone参数影响(日期必须存储为UTC)

2)是否存在查询
查找指定字段包含非空值的文档
{"exists":{"field":"user"}}
null,[],[null]为空值

3)为空查询
{"bool":{"must_not":{"exists":{"field":"user"}}}}
该查询返回user字段没有值的文档

4)前缀查询
查找拥有特定前缀的索引词(不分词),前缀查询对应于lucene中的PrefixQuery
#查询user字段包含以ki开头的索引词的文档
{"prefix":{"user":"ki"}}

5)通配符查询
字段匹配通配符表达式(不分词)。*匹配任意字符含空字符,?匹配任何单个字符。这种查询可能会比较缓慢,需要在许多索引词上重复执行
为避免极端缓慢的通配符查询,通配符索引词不应该以一个通配符开头。通配符查询对应lucene中的WildcardQuery
{"wildcard":{"user":"ki*y"}}

6)模糊查询
对字符串型字段使用基于编辑距离的相似性,以及数字型和日期型字段的正负(+/-)范围进行匹配
字符串型字段:
模糊查询基于fuzziness指定的最大编辑距离生成所有可能匹配的索引词,然后检查索引词字典来找出确实存在于索引中的索引词
{"fuzzy":{"user":{"value":"ki","boost":1.0,"fuzziness":"2,"prefix_length":0,"max_expansions":100}}}
参数说明:
fuzziness,最大编辑距离,默认AUTO
prefix_length,不会被模糊化的最初字符数量,可以用来减少必须审查的索引词数量,默认为0
max_expansions,模糊查询将要扩展的索引词最大数量,默认50
数字型和日期型字段:
使用fuzziness值作为范围来执行模糊查询
-fuzziness <= field value <= +fuzziness
{"fuzzy":{"price":{"value":12,"fuzziness":2}}} #会查询value值范围在10到14之间的结果
{"fuzzy:{"created":{"value":"2010-02-05T12:05:07","fuzziness":"1d"}}}

7)类型查询
根据匹配提供的映射类型来过滤文档
{"type":{"value":"secilog"}}

8)主键查询
获取只拥有提供的主键的文档,注意,查询使用_uid字段
{"ids":{"type":"secilog","values":["1","4","100"]}}
type选项是可选的,也可接受数组形式的值,若没有指定类型,所有定义在索引映射中的类型都会被尝试

复合查询

 

复合查询是包含其他叶查询的查询,还可以再包含复合查询,并结合结果和匹配得分来改变它们的行为,或者可以从查询中进行内容过滤
1、常数得分查询
这个查询包含另一个查询,并且仅返回过查询中任何常数得分等于查询加权的文档,对应lucene中的ConstantScoreQuery
{"constant_score":{"filter":{"term":{"user":"kimchy"}},"boost":1.2}}

2、布尔查询
获取匹配其他查询的布尔值的文档,对应lucene的BooleanQuery,基于一个或多个布尔子句的使用,每个子句都有一类事件
must,必须出现在匹配文档中,并且会影响匹配得分
filter,必须出现在匹配文档中,匹配得分会被忽略
should,应该出现在匹配文档中,在布尔查询中如果没有must或filter子句,文档必匹配一个或多个shoud子句。应该匹配的should子句的最小数量可以通过minimum_should_match参数进行设置
must_not,必须不出现在匹配文档中
注意:如果查询用于过滤内容且有should子句,那么最少一个should子句需要被匹配
布尔查询支持disable_coord参数,默认为false
布尔查询采取匹配越多越好的方式,所以每个匹配的must或should子句的得分会被加在一起,提供最终的_score
{"bool":{"must":{"term":{"user":"kimchy"}},filter":{"term":{"tag":"tech"}},"must_not":{"range":{"age":{"from":10,"to":20}}},"should":[{"term":{"tag":"wow"}},{"term":{"tag":"elasticsearch"}}},minimum_should_match":1,"boost":1.0}}
bool.filter匹配得分
在filter元素下指定的查询对匹配得分没有影响,返回得分为0,得分仅受指定查询的影响
#获取所有status字段包含active索引词的文档
GET secisland/_search {"query":{"bool":{"filter":{"term":{"method":"post"}}}}} #该查询对所有文档匹配得分均为0,因为没有指定查询获取匹配得分
GET secisland/_search {"query":{"bool":{"query":{"match_all":{}},"filter":{"term":{"method":"post"}}}}} #bool不支持query
拥有match_all查询的布尔查询对每个文档指定匹配值为1.0
GET secesland/_search {"query":{"constant_score":{"filter":{"term":{"method":"post"}}}}} #constant_score查询对所有通过过滤匹配的文档指定分值1
如果需要知道查询返回的文档匹配布尔查询的哪一条查询子句,可以使用命名查询对每个子句进行命名

3、最大值获取查询
通过执行自己的子查询生成文档的并集,且用文档执行任何子查询的最大匹配得分作为文档得分,对应lucene的DisjunctionMaxQuery
{"dis_max":{"tie_breaker":0.7,"boost":1.2,"queries":[{"term":{"age":34}},{"term":{"age":35}}]}}

4、boosting查询
可以用来有效降级匹配给出的查询结果。不像布尔查询的NOT子句,boosting查询仍然选择包含不合需要的索引词的文档,但降低了它们的整体得分
{"boosting":{"positive":{"term":{"field1":"value1"}},"negative":{"term":{"field2":"value2"}},"negative_boost":0.2}}  #positive肯定的;negative否定的

5、指定索引查询
当搜索在多个索引中执行时,可以指定索引,通过指定一个索引的列表和一个内部查询,这个内部查询仅在索引名匹配列表时执行,若搜索其它不在列表中的索引时,执行no_match_query
{"indices":{"indices":["index1","index2"],"query":{"term":{"tag":"wow"}},"no_match_query":{"term":{"tag":"kow"}}}}
可以使用indices字段提供单独的索引。no_match_query可以赋值为none(不匹配任何文档),或者all(匹配所有文档),默认为all
#字段顺序是重要的,indices在query和no_match_query之前提供

6、AND、OR、NOT查询
在其他查询中使用AND、OR、NOT布尔操作符匹配文档
{"filtered":{"query":{"term":{"name.first":"shay"}},"filter":{"and":[{"range":{"postDate":{"from":"2018-03-01","to":"2018-05-01"}}},{"prefix":{"name.second":"ba"}}]}}}

7、过滤查询
过滤查询仅用来过滤结果集,并且另一个集合用来计算匹配得分的查询
#通过过滤尽可能多地排除文档,然后仅在剩下的文档中执行查询
GET secisland/_search {"query":{"filtered":{"query":{"match":{"method":"post"}},"filter":{"range":{"timestamp":{"gte":"now-2d/d"}}}}}}
过滤查询作为query参数的值传递给搜索请求
1)不包含查询的过滤
若不指定查询,默认包含全匹配查询
{"query":{"filtered":{"query":{"filter":{"range":{"timestamp":{"lte":"now-2d/d"}}}}}}
#没有指定查询,仅过滤,返回过滤后的所有结果
2)多重过滤
多重过滤可以通过包含布尔查询来使用
{"filtered":{"query":{"match":{"secilog":"full text search"}},"filter":{"bool":{"must":{"range":{"created":{"gte":"now-1d/d}}},"should":[{"term":{"featured":true}},{"term":{"starred":true}}],"must_not":{"term":{"deleted":false}}}}}}

8、限制查询
限制查询限制执行文档(每个分片的)的数量
{"filtered":{"filter":{"limit":{"value":100}},"query":{"term":{"name.first":"shay"}}}}

连接查询

在es中执行完整的SQL类型的表关联查询的代价是昂贵的。但es还是提供了两种方式的关联,一种是嵌套,一种是父子关系

1、嵌套查询
嵌套查询可以查询嵌套对象/文档,执行的查询把嵌套对象/文档视作父文档的单独文档

path指出嵌套对象的路径,query查询的范围是在匹配路径的嵌套文档中。任何在查询中引用的字段必须使用全路径
score_mode可以设置内部子匹配如何时影响父匹配得分,默认为avg,也可以为sum/min/max/none
自动支持和检查多级别嵌套,如果内部嵌套查询布在于其他嵌套查询中,会自动匹配相关嵌套级别2、父/子文档查询
1)子文档查询
将父文档拥有的查询返回匹配到的子文档
{"has_child":{"type":"blog_tag","query":{"term":{"tag":"something"}}}}
子文档查询支持匹配得分,支持模式有min、max、sum、avg或none,默认值为none,表示产生和前版本相同的行为。
如果得分模式设置为其它值,所有匹配的子文档得分聚合成相关的父文档得分。通过score_mode字段来指定得分类型
{"has_child":{"type":"blog_tag","score_mode":"sum","query":{"term":{"tag":"something"}}}}
子文档查询可以指定最小或者最大数量的子文档
{"has_child":{"type":"blog_tag","score_mode":"sum","min_children":2,"max_children":10,"query":{"term":{"tag":"something"}}}}
2)父文档查询
在父文档空间执行,通过parent_type指定,返回关联匹配的父文档的子文档。工作方式和子文档查询一样,也接受相同的参数
{"has_parent":{"parent_type":"blog","query":{"term":{"tag":"something"}}}}
父文档查询支持的得分类型为score或者none,默认为none,忽略从父文档得到的匹配得分,此时,匹配得分基于查询增益,默认是1
如果得分类型设置为score,父文档的匹配得分聚合到属于它的子文档
{"has_parent":{"parent_type":"blog","score_mode":"score","query":{"term":{"tag":"something"}}}}
地理查询

es支持两种类型的地理数据字段:地理点类型,支持经纬度对;地理形状类型,支持点、线、圈、多边形、多边形集合等

1、地理形状查询
地理形状查询使用相同的方格表示为地理形状映射来查找文档,拥有与查询形状相交的形状
查询支持两种方式来定义查询形状,通过提供整个形状定义或引用预索引在其他索引中的形状名
1)形状定义
地理形状过滤使用GeoJSON表示形状
{"query":{"bool":{"must":{"match_all":{}},"filter":{"geo_shape":{"location":{"shape":{"type":"envelope","coordinates":[[13.0,53.0],[14.0,52.0]]},"relation":"within"}}}}}}
2)预索引形状
查询支持使用存储于其他索引或索引类型中的形状,当存在一个预定义的形状列表时,可以使用逻辑名(如南京)来引用,不需要每次都提供具体的坐标值
这种情况下,需要提供的参数有:
id,包含预索引形状的文档ID
index,预索引形状的索引名,默认为shape
type,预索引形状的索引类型
path,指定的字段作为包含预索引形状的路径,默认为shape
{"bool":{"must":{"match_all":{}},"filter":{"geo_shape":{"location":{"indexed_shape":{"id":"EDU","type":"countries","index":"shapes","path":"location"}}}}}}
3)空间关系
所有可以使用的空间关系操作符如下:
INTERSECTS,返回地理形状字段和查询集合相关的所有文档,默认
DISJOINT,返回地理形状字段和查询集合没有关联的所有文档
WITHIN,返回地理形状字段在查询集合内的所有文档
CONTAINS,返回地理形状字段包含查询集合的所有文档

2、地理范围查询
基于一个位置点的范围来过滤查询文档
{"bool":{"must":{"match_all":{}},"filter":{"geo_bounding_box":{"pin.location":{"top_left":{"lat":40.73,"lon":-74.1},"bottom_right":{"lat":40.01,"lon":-71.12}}}}}}
查询选项如下:
_name,可选名称字段来定义过滤请求
ignore_malformed,设置为true来接受无效的经纬度定义的地理点,默认为false
type,设置为indexed或memory,定义过滤会在索引还是内存中执行,默认为memory
接受的格式:
#经纬度作为参数
"filter":{"geo_bounding_box":{"pin.location":{"top_left":{"lat":40.73,"lon":-74.1},"bottom_right":{"lat":40.01,"lon":-71.12}}}}
#经纬度数组
"filter":{"gep_bounding_box":{"pin.location":{"top_left":[-74.1,40.73],"bottom_right":[-71.12,40.01]}}}
#经纬度字符串
"filter":{"geo_bounding_box":{"pin.location":{"top_left":"40.73,-74,1","bottom_right":"40.01,-71,12"}}}
#地理散列
"filter":{"gep_bounding_box":{"pin.location":{"top_left":"dr5r9ydj2y73","bottom_right":"drj7teegpus6"}}}
地理范围的顶点可以通过top_left、bottom_right或者top_right、bottom_left参数设置,还可以使用top、left、bottom、right分别设置
"filter":{"top_bounding_box":{"pin.location":{"top":-74.1,"left":40.73,"bottom":-71.12,"right":40.01}}}

3、地理距离查询
获取一个地理点确切距离内的所有文档
{"bool":{"must":{"match_all":{}},"filter":{"geo_distance":{"distance":"200km","pin.location":{"lat":40,"lon":-70}}}}}
接受的格式如下
#经纬度作为参数
"filter":{"geo_distance":{"distance":"12km","pin.location":{"lat":40,"lon":-70}}}
#经纬度数组
"filter":{"geo_distance":{"distance":"12km","pin.location":[40,-70]}}
#经纬度字符串
"filter":{"geo_distance":{"distance":"12km","pin.location":"40,-70"}}
#地理散列
"filter":{"geo_distance":{"distance":"12km","pin.location":"drm3btev3e86"}}

4、地理距离范围查询
获取在于一个地理点一定距离范围内的所有文档
{"bool":{"must":{"match_all":{}},"filter":{"geo_distance_range":{"from":"200km","to":"400km","pin.location":{"lat":40,"lon":-70}}}}}
支持和地理距离过滤相同的位置点参数和查询选项,也支持通用的范围参数:lt,lte,gt,gte,from,to,include_upper,include_lower

5、多边形地理查询
查询可以包含命中多边形内的点
{"bool":{"query":{"match_all":{}},"filter":{"geo_polygon":{"person.location":{"points":[{"lat":40,"lon":-70},{"lat":30,"lon":-80},{"lat":20,"lon":-90}]}}}}}
接受的格式如下:
#经纬度数组
"filter":{"geo_polyon":{"personlocation":{"points":[[-70,40],[-80,30],[-90,20]]}}}
#经纬度字符串
"filter":{"geo_polyon":{"personlocation":{"points":["40,-70","30,-80","20,-90"]}}}
#地理散列
"filter":{"geo_polyon":{"personlocation":{"points":["drn5xlg8cu2y","30,-80","20,-90"]}}}

6、地理散列单元查询
提供地理散列层次结构的访问,通过定义地理散列单元,只有单元里的地理点会匹配这个查询
为使过滤生效,所有地理散列前缀需要添加到索引中,如一个地理散列u30需要分解为三个索引词:u30,u3,u,这个分解必须在需要执行过滤的地理字段映射中启用,通过设置geohash_prefix选项:
{"mappings":{"location":{"properties":{"pin":{"type":geo_point","geohash":true,"geohash_prefix":true,"geohash_precision":10}}}}}
地理散列单元可以通过所有格式的地理点定义,如果单元通过经纬度值定义,需要设置单元的大小,通过过滤中的precision参数进行定义,设置一个整数值表示地理散列前缀的长度。除了直接设置地理散列长度,也可以用距离来定义精确度,如"precision":"50m"
{"bool":{"must":{"match_all":{}},"filter":{"geohash_cell":{"pin":{"lat":13.4080,"lon":52.5186},"precision":3,"neighbors":true}}}}

跨度查询
跨度查询是低级别的按位查询,在指定索引词的顺序和接近度上提供专门的控制。通常用于法律或专利文档上执行非常具体的查询
跨度查询不能与非跨度查询混合(多索引词跨度查询例外)1、索引词跨度查询
匹配包含索引词的跨度,对应lucene中的SpanTermQuery
{"span_term":{"user":"kimchy"}}
增益也可以关联到查询中:
{"span_term":{"user":{"value":"kimchy","boost":2.0}}}
或者
{"span_term":{"user":{"term":"kimchy","boost":2.0}}}2、多索引词跨度查询
可以封装多索引词查询(任何一个通配符、模糊、前缀、索引词、范围或正则表达式查询)为跨度查询,所以可以被嵌套
{"span_multi"{"match":{"prefix":{"user":{"value":"ki","boost":1.08}}}}}3、首跨度查询
匹配字段开始附近的跨度,对应lucene中SpanFirstQuery
{"span_first":{"match":{"span_term":{"user":kimchy"}},"end":3}}
match子句可以是任何其他类型的跨度查询,end参数控制匹配中允许的最大结束位置4、接近跨度匹配
匹配接近另一个的跨度,可以定义溢出值,表示介于不匹配位置之间的最大值,以及匹配是否按顺序提交请求,对应lucene中SpanNearQuery
{"span_near":{"clauses":[{"span_term":{"field":"value1"}},{"span_term":{"field":"value2}},{"span_term":{"field":"value3"}}],"slop":12,"in_order":false,"collect_payloads":false}}
clauses元素是一个或更多其他类型的跨度查询列表

5、或跨度查询
匹配它的跨度子句的并集,对应lucene中SpanOrQuery
{"span_or":{"clauses":[{"span_term":{"field":"value1"}},{"span_term":{"field":"value2}},{"span_term":{"field":"value3"}}]}}
clauses元素是一个或更多其他类型的跨度查询列表

6、非跨度查询
移除与另一个跨度查询重叠的匹配,对应lucene中SpanNotQuery
{"span_not":{"include":{"span_term":{"field1":"boya"}},"exclude":{"span_near":{"clauses":[{"span_term":{"field1":"la"}},{"span_term":{"field1":"hoya"}}],"slop":0,"in_order":true}}}}
include和exclude子句可以是任何类型的跨度查询,include子句的匹配会被过滤掉,exclude子句返回的匹配必须没有重叠的部分

7、包含跨度查询
返回封装另一个跨度查询的匹配,对应lucene中SpanContainingQuery
{"span_containing":{"little":{"span_term":{"field1":"foo"}},"big":{"span_near":{"clauses":[{"span_term":{"field1":"bar"}},{"span_term":{"field1":"baz"}}],"slop":5,"in_order":true}}}}
big和little子句也以是任何类型的跨度查询,从big匹配的跨度到包含从little返回的匹配

8、内部跨度查询
返回内部封装的另一个跨度查询的匹配,对应lucene中的SpanWithinQuery
{"span_within":{"little":{"span_term":{"field1":"foo"}},"big":{"span_near":{"clauses":[{"span_term":{"field1":"bar}},{"span_term":{"field1":"baz"}}],"slop":5,"in_oorder":true}}}}
big和little子句可以是任何类型的跨度查询,从little匹配的跨度被封装在big返回的跨度中

高亮显示
es的高亮显示来源于lucene,允许一个或多个字段突出显示搜索内容。lucene支持三种高亮显示方式:highlighter、fast-vector-hithlighter、postings-highlighter,highlighter为默认的标准类型
PUT secilog/log/1 {"type":"file","message":"secilog is a log real-time analyse software,it's full text search is based on Elasticsearch"}
POST secilog/log/_search {"query":{"term":{"message":"analyse"}},"highlight":{"fields":{"message":{}}}}
#高亮显示使用<em>analyse</em>
为执行高亮显示,该字段需要有实际的内容,且必须进行存储,即字段映射中store值必须为true,不能只在内存中。
系统会自动加载_source字段并匹配相关的列
字段名称支持通配符,如"message*":{} 这将匹配所有message开头的字段fast-vector-hithlighter
其特点为:
1、快,特别是内容大的字段,比如大于1mb
2、可定制boundary_chars,boundary_max_scan,和fragment_offset
3、可设置term_vector值为with_positions_offsets,增加索引大小
4、可以将多个字段的匹配组合成一个结果
5、可以权重匹配分配在不同的位置上
要实现fast-vector-hithlighter需要映射字段类型
#对content字段采用fast-vector高亮
{"type_name":{"content":{"type":"string","term_vector":"with_positions_offsets"}}}postings-hithlighter
其特点为:
1、快,因为它不需要重新分析文档:尤其是对大文件对性能的提高更为明显
2、占用更少的磁盘空间
3、把高亮显示和句子分开,这个更有利于人类阅读
4、使用BM25算法,使搜索的时候像是整篇文档
要实现postings-hithlighter需要映射字段类型
#对content字段采用postings高亮类型
{"type_name":{"content":{"type":"string","index_options":"offsets"}}}注:高亮查询不支持复杂查询,如match_phrase_prefix
fast-vector-hithlighter和postings-hithlighter会增加索引的大小,但会减少查询的执行时间
使用type字段可以强制使用特定的高亮类型,当设置了term_vectors高亮时,相用普通高亮显示也非常有用。type可设置为三种类型:plain、postings、fvh,分别对应高亮显示的三种类型,如
{"query":{"term":{"message":"analyse"}},"highlight":{"fields":{"message":{"type":"plain"}}}}

默认情况下,亮亮显示文本在<em>和</em>中,可以通过设置pre_tags和post_tags进行修改,如
{"query":{"term":{"message":"analyse"}},"highlight":{"pre_tags":["<b>"],"post_tags":["</b>"],"fields":{"message":{"type":"plain"}}}}
可以有多个标签用数组进行表示,按照"重要性"进行排序,如
{"query":{"term":{"message":"analyse"}},"highlight":{"pre_tags":["<b1>","<b2>"],"post_tags":["</b1>","</b2>"],"fields":{"message":{"type":"plain"}}}}
系统对有多个pre_tags的情况,需要设置tags_schema为styled,默认post_tags为</em>,默认多个pre_tags标签为<em class="hlt1">,<em class="hlt2">,...<em class="hlt10">
{"query":{"term":{"message":"is"}},"highlight":{"tag_schema":"styled","fields":{"message":{}}}}

每个字段都可以设置高亮显示的字符片fragment_size大小,默认为100,以及返回的最大片段数number_of_fragments,默认5,如果number_of_fragments值设置为0则片段产生,当order设置为score时可以按照评分进行排序,如
{"query":{...},"highlight":{"order":"score","fields":{"content":{"fragment_size":150,"number_of_fragments":3}}}}

简化查询

 

es提供一套精简API来查看系统状态,官方叫cat API。主要是由于es默认接口返回都是JSON格式,不利于人类阅读,所以搞出cat API进行简化
每个命令都以/_cat开头,可以接受v参数得到详细输出;可以通过help参数得到每列的帮助;可以通过h=参数名返回部分内容,多个参数可以用逗号分开,甚至可以支持通配符
GET http://localhost/_cat/master?v
GET http://localhost/_cat/master?help
可以对系统大部分内部结构进行简化查询,比如索引信息、节点信息,这些内部结构简称指标

1、indices
有非常多的参数,可以用help查看
/_cat/indices?v
/_cat/indices?pri&v&h=health,index,prirep,docs.count,mt
2、nodes
有非常多的参数,可以用help查看
/_cat/nodes?v
/_cat/nodes?v&h=id,ip,port,v,m,jdk
3、recovery
一个集群中,一个索引的分片可能随时会从一个节点迁移到另一个节点,比如在恢复快照的过程中,新节点启动的过程中,等等
/_cat/recovery/secisland?v
通过增加副本节点的数量可以让分片的数据进行传输
4、thread pool
线程池有非常多的参数,可以用help查看
/_cat/thread_pool?v&h=id,host,suggest.active,suggest.rejected,suggest.complete

 

转载请注明:轻风博客 » elasticsearch技术解析与实战(三) 搜索

喜欢 (0)or分享 (0)