elasticSearch - 高级检索
Posted 生而为人我很遗憾
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticSearch - 高级检索相关的知识,希望对你有一定的参考价值。
一、基础知识
ES的搜索由两部分组成:1、查询;2、获取 ;一般来讲,ES很少用match_all查询,正常是通过查询+过滤器组合的方式来完成;后者不计算得分,且结果可被缓存,性能会更好。具体采用哪种查询类型取决于数据在索引中是如何存储的;
查询过滤器
用于过滤查询结果用,一般用在查询和聚合查询的body条件中。
查询 | 格式 | 说明 | 适用场景 |
match_all | match_all: | 匹配所有文档 | 全文检查,不太建议用 |
query_string | query_string: | 相当于es中开放的由用户自己发挥的通用API,支持+-号等语言 | 百度 |
terms | terms:tags: | 相当于同时查多个词条 | 关键词匹配,在搜索时不进行分析 |
term | term:tags: | 只查一个词条 | 关键词匹配,在搜索时不进行分析 |
match | match:name: | 百度 | |
bool | match: name: query:"", operator:"and"
| 它带了一个operator属性,用于指定词条的组合关系,相当于or或and | |
phrase | match: name: query:"", slop:1, type:"phrase"
| 适用于多关键字and查询,通过slop来指定关键字的距离,比如只记得某个句子中2个单词,但中间的记不住了,就可以用这个查询 | 查询相似的词组,这里的slop不宜过大,会影响性能。但可以通过query_weight和rescore_query_weight限定评分范围进行二次打分来减少这个影响。 |
phrase_prefix | match: name: query:"", max_expansion:1, type:"phrase_prefix"
| 最后一个词条的前缀匹配,比如输入liudong he可以匹配liudong hemin | |
multi | must、must_not、should | must=and must_not=not should=or | |
range | filter:range:"time": gt:"", lt:"" | 范围,相当于between | 范围查询,比如时间或数值和字符串 |
prefix | query:prefix: | 相当于like前缀查询,相当于like aaa% | |
wildcard | query:wildcard: | 正则表达式,通配符可以用*和% | |
exists | 只查询有特定字段的文档 | ||
missing | 查询没有指定字段的文档,包括null。 |
二、通用用法
常用结构
es的搜索就是由两部分组成:查询和过滤。
"query":
"bool":
"must": [ //1、
"match": "field": "sss" //2、
],
"filter": [ //3、
"term": "status":"published" ,
"term": "date":"gte": "2015-12-21" //4、可选term, range
]
匹配查询
精确匹配-match
"query":
"match":
"message": "this ia a test"
模糊匹配-operator
这个是默认生效的,同时也允许换位比如ab--ba。通过fuzzy_trans_positions=false可关闭这个换位功能。
GET customer/_search
"query":
"match":
"textField":
"query":"this ia a test",
"operator":"and" //or
短语匹配-match_phrase
也可以自定义解析器,在下列第5行message后面再加上"analyzer":"my_analyzer"。
//短语匹配-match_phrase
"query":
"match_phrase":
"message": "this ia a test"
字符串查询
query_string查询解析输入并围绕运算符拆分文本,每个文本部分都是独立解析的, query属性相当于sql的where语句,其中and , or 为关键字。
"query":
"query_string":
"default_field": "fieldName",
"query":"this AND that OR thus"
"query":
"query_string":
"default_field": "fieldName",
"query":"(new york city) OR (big apple)"
指定匹配多个字段
"query":
"query_string":
"fields": ["fieldName1", "fieldName2"], //这里可以用通配符,比如"city.*"
"query":"(new york city) OR (big apple)"
范围查询
"query":
"query_string":
"fields": ["fieldName1", "fieldName2"],
"query":"(new york city) OR (big apple) AND date:[2021 TO 2022]"
子查询
"query":
"query_string":
"fields": ["fieldName1", "fieldName2"],
"query":"(order_type:100 AND pay_time:[22312312 TO *] AND (store_code:(1001) AND goods_no:(0000 OR p33432) ) )"
三、特殊用法
高亮结果
这里需要设置关键字查询,如果没有query指定的关键字则不会显示高亮结果,有三种高亮器:unified(默认)、plain、fvh。这个功能还有很多其它特性,但用到最基本的就可以了。
"from": 0,
"size": 2,
"query":
"match": "firstname": "Hattie"
,
"highlight":
"fields":
"firstname":
//返回结果如下
, "highlight":
"firstname": [
"<em>Hattie</em>"
]
//上面的em是默认的,可以通过以下方式自定义
"highlight":
"pre_tags": ["<tage1>"],
"post_tags": ["</tage1>"],
"fields":
"firstname":
索引加权
这个功能在有时做扩容时会用,即多个索引存储同样的内容,毕竟主分片是不能修改的。下例中的通配符很重要,如果匹配了多个则默认选择第一个,如果一个索引同时存在在多个索引里面,则使用权重高的那个。
"indices_boost": [
"alias1": 1.4,
"index*": 1.3
]
滚动查询
不适合实时用户请求,适用于处理大量数据。
GET /_search?scroll=1m #scroll=1m 表示将搜索上下文保持活跃1m,在这1m内忽略文档的后续修改,每次请求都会重置此时间。
"size": 100
//返回的结果中多了一个,这个值适合传递给下一次的查询,直到没有结果返回
"_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEc1bDNRSUFCQWh1VUxxTFZ1XzJsAAAAAAAAACsWSi1Jc3M2NnNTbWVkN3dkLVZqVC1sZw==",
"size": 100,
"_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEc1bDNRSUFCQWh1VUxxTFZ1XzJsAAAAAAAAACsWSi1Jc3M2NnNTbWVkN3dkLVZqVC1sZw=="
//scroll=1m是有成本的,所以最后一次请求最好手工删除上下文,其中_scroll_id值可为[],多个值用逗号分隔。
DELETE /_search?scroll
"_scroll_id": "FGluY2x1ZGVfY29udGV4dF91dWlkDXF1ZXJ5QW5kRmV0Y2gBFEc1bDNRSUFCQWh1VUxxTFZ1XzJsAAAAAAAAACsWSi1Jc3M2NnNTbWVkN3dkLVZqVC1sZw=="
或 DELETE /_search?scroll/ElasticSearch高级操作