elasticSearch - 高级检索

少年击剑更吹箫,剑气箫心一例消。这篇文章主要讲述elasticSearch - 高级检索相关的知识,希望能为你提供帮助。
一、基础知识ES的搜索由两部分组成:1、查询;2、获取 ;一般来讲,ES很少用match_all查询,正常是通过查询+过滤器组合的方式来完成;后者不计算得分,且结果可被缓存,性能会更好。具体采用哪种查询类型取决于数据在索引中是如何存储的;

elasticSearch - 高级检索

文章图片

查询过滤器
用于过滤查询结果用,一般用在查询和聚合查询的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
]

滚动查询
【elasticSearch - 高级检索】不适合实时用户请求,适用于处理大量数据。
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/

    推荐阅读