elasticSearch - 高级检索

Posted 生而为人我很遗憾

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticSearch - 高级检索相关的知识,希望对你有一定的参考价值。

一、基础知识

ES的搜索由两部分组成:1、查询;2、获取 ;一般来讲,ES很少用match_all查询,正常是通过查询+过滤器组合的方式来完成;后者不计算得分,且结果可被缓存,性能会更好。具体采用哪种查询类型取决于数据在索引中是如何存储的;

elasticSearch(6)

查询过滤器

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

谷粒商城高级篇Elasticsearch:全文检索

Elasticsearch之打分机制集群搭建脑裂问题

Elasticsearch之打分机制集群搭建脑裂问题

PassJava 开源项目(二十)之 详解 Elasticsearch 高级检索玩法

elasticSearch - 高级检索