-
URI-Search
-
通过url query参数来实现搜索,常用参数如下:
- q指定查询的语句,语法为Query String Syntax
- df q中不指定字段时默认查询的字段,如果不指定, es会查询所有字段
- sort排序
- timeout指定超时时间,默认不超时
- from,size用于分页
-
Query String Syntax
-
term与phrase
- alfred way等效于alfred OR way
- "alfred way"词语查询,要求先后顺序
-
泛查询 alfred等效于在所有字段去匹配该term
-
指定字段 name:alfred
-
Group分组设定,使用括号指定匹配的规则
- (quick OR brown) AND fox
- status:(active OR pending) title:(full text search)
-
布尔操作符
- AND(&&), OR(|), NOT()
- name:(tom NOT lee)
- 注意大写,不能小写
- +-分别对应must和must not
- name:(tom +lee -alfred)
- bname(lee && !alfred) l (tom && lee && !alfred))
- +在url中会被解析为空格,要使用encode后的结果才可以,为%2B
- AND(&&), OR(|), NOT()
-
-
范围查询,支持数值和日期
- 区间写法,闭区间用0 ,开区间用{}
- age:[1 TO 10]意为1<=age<=10
- age:[1 TO 10}意为1<=age<10
- age:[1 TO ]意为age>=1
- age:[* TO 10]意为age<=10
- 算数符号写法
- age:>=1
- age:(>=1 && <=10) 或者 age:(+>=1 +<=10)
- 区间写法,闭区间用0 ,开区间用{}
-
通配符查询
- ?代表1个字符,*代表0或多个字符
- name:t?m
- name:tom*
- name:t*m
- 通配符匹配执行效率低,且占用较多内存,不建议使用 如无特殊需求,不要将?/*放在最前面
- ?代表1个字符,*代表0或多个字符
-
模糊匹配fuzzy query
- name:roam~ 1 匹配与roam差1个character的词,比如foam roams等 近似度查询proximity search
- "fox quick"~5 以term为单位进行差异比较,比如"quick fox" "quick brown fox"都会被匹配
-
正则匹配
- name: /[mb]oat/
-
-
Request Body Search
-
将查询语句通过http request body发送到es ,主要包含如下参数
- query符合Query DSL语法的查询语句
- from,size
- timeout
- sort
-
基于JSON定义的查询语言, 主要包含如下两种类型:
- 字段类查询 口如term, match, range等,只针对某一 个字段进行查询
- 复合查询 如bool查询等,包含一 个或多个字段类查询或者复合查询语句
-
字段类查询主要包括以下两类:
-
全文匹配
- 针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match,match_ phrase等query类型
-
通过operator参数可以控制单词间的匹配关系,可选项为or和and
-
通过minimum should match 参数可以控制需要匹配的单词数
-
单词匹配
- 不会对查询语句做分词处理,直接去匹配字段的倒排索引,如term, terms,range等query类型
-
-
相关性算分
-
相关性算分是指文档与查询语句间的相关度,英文为relevance
- 通过倒排索引可以获取与查询语句相匹配的文档列表,那么如何将最符合用户查询的需求的文档放到前列呢?
- 本质是一个排序问题,排序的依据是相关性算分
-
相关性算分的几个重要概念如下:
- Term Frequency(TF)词频,即单词在该文档中出现的次数。词频越高,相关度越高
- Document Frequency(DF)文档频率,即单词出现的文档数
- Inverse Document Frequency(IDF)逆向文档频率,与文档频率相反,简单理解为1/DF。即单词出现的文档数越少,相关度越高
- Field-length Norm文档越短,相关性越高
-
ES目前主要有两个相关性算分模型,如下:
-
TF/IDF模型
-
BM25模型5.x之后的默认模型
BM25模型中BM指Best Match , 25指迭代了25次才计算方法,是针对TF/IDF的一个优化,其计算公式如下:
-
-
可以通过explain参数来查看具体的计算方法,但要注意:
- es的算分是按照shard进行的,即shard的分数计算是相互独立的,所以在使用explain的时候注意分片数
- 可以通过设置索引的分片数为1来避免这个问题
-
-
Match Phrase Query
-
对字段作检索,有顺序要求, API示例如下:
-
通过slop参数可以控制单词间的间隔
-
-
Query String Query
-
类似于URI Search中的q参数查询
-
-
Simple Query String Query
-
类似Query String ,但是会忽略错误的查询语法,并且仅支持部分查询语法,其常用的逻辑符号如下,不能使用AND、OR、NOT等关键词:
- +代指AND
- |代指OR
- -代指NOT
-
-
-
Term Query
-
将查询语句作为整个单词进行查询,即不对查询语句做分词处理,如下所示:
-
一次传入多个单词进行查询(Terms Query) ,如下所示:
![image-20190113203630267](/Users/gaowenfeng/Library/Application Support/typora-user-images/image-20190113203630267.png)
-
-
Range-Query
-
范围查询主要针对数值和日期类型,如下所示:
-
针对日期进行查询:
-
针对日期提供的一-种更友好地计算方式(Date-Math),格式如下:
-
单位有如下几种
- y - years
- M - months
- W - weeks
- d- days
- h - hours
- m - minutes
- S- seconds
-
-
-
复合查询
-
复合查询是指包含字段类查询或复合查询的类型,主要包括以下几类:
- constant_ score query
- bool query
- dis_ max query
- function_ score query
- boosting query
-
Constant Score Query
-
该查询将其内部的查询结果文档得分都设定为1或者boost的值
-
多用于结合bool查询实现自定义得分
-
-
-
Bool Query
-
布尔查询由一个或多个布尔子句组成,主要包含如下4个:
-
-
Filter 查询只过滤符合条件的文档,不会进行相关性算分
- es针对filter会有智能缓存,因此其执行效率很高
- 做简单匹配查询且不考虑算分时,推荐使用filter替代query等
- ![image-20190113205549381](/Users/gaowenfeng/Library/Application Support/typora-user-images/image-20190113205549381.png)
-
must
-
Must_not
![image-20190113205918544](/Users/gaowenfeng/Library/Application Support/typora-user-images/image-20190113205918544.png)
-
Should使用分两种情况:
-
bool查询中只包含should ,不包含must查询,只包含should时,文档必须满足至少一个条件,minimum should match可以控制满足条件的个数或者百分比
-
bool 查询中同时包含should和must查询,同时包含should和must时,文档不必满足should中的条件,但是如果满足条件,会增加相关性得分
-
-
当一个查询语句位于Query或者Filter上下文时, es执行的结果会不同,对此如下:
-
-
Count api
-
获取符合条件的文档数, endpoint 为count
-
-
Source Filtering
-
过滤返回结果中_source 中的字段,主要有如下几种方式:
-
-
Es-Search Api 详解
最新推荐文章于 2023-06-24 00:23:57 发布