1.概览
实现对es中存储的数据进行查询分析,endpoint为_search,如下示例:
查询主要有两种形式
URI Search
操作简便,方便通过命令行测试。
仅包含部分查询语法
Request Body Search
es提供完备的查询语法Query DSL(Domain Specific Language)
2.URI Search 详解
通过url query参数来实现搜索,常用参数如下:
q指定查询语句,语法为Query String Syntax。
df(default field) q中不指定字段,默认查询所有字段。
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
指定匹配的优先级,必须先满足(quick or brown)这个条件,在满足fox这个条件。
status:(active or pending) title:(full text search)
查询status是active 或者 pending。如果去掉,语意就会变为status是active或者所有字段中包含pending的结果。
查询title中包含full或者text或者search的所有文档,如果去掉,语意就会变为查询title是full或者所有字段中包含text or search的文档。
布尔操作符
AND(&&),OR(||),NOT(!)
name:(tom NOT lee),语意,name中不包含lee,包含tom的所有文档。
AND、OR、NOT一定得大些,不能小写。
+ - 分别对应的是must和must not
name:(tom +lee -alfred)语意,一定有lee,一定没有alfred,可以包含tom的所有文档。
+ 在url中会被解析为空格,要使用encode后的结果才可以,为%2B。
范围查询,支持数值和日期
区间写法,闭区间[],开区间{}。
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) 或者(+>=1 +<=10)
通配符查询
? 代表一个字符,* 代表0个或多个字符。
name:t?m。
name:tom*。
name:t*m。
通配符匹配执行效率低,占用较多内存,不建议使用。
如无特殊需求,不将?/*放在最前面。
正则表达式
name:/[mb]oat/
模糊匹配查询
name:roam~1
匹配与roam差一个character的词,比如foam roams等。
近似度查询proximity search
"fox quick"~5。
以term为单位进行差异比较(允许有5个差异),比如"quick fox"、"quick brown fox"都会匹配。
3.Request Body Search
将查询语句通过http request body发送到es,主要包含如下参数:
query 符合Query DSL语法的查询语句。
from,size。
timeout
sort
...
4.Query DSL
基于json定义的查询语言,主要包含如下两种类型:
字段类型查询
如term、match、range等,只针对某一个字段进行查询。
符合查询
如boolean查询,包含一个或多个字段查询或符合查询语句。
5.字段类型查询关键字的使用
Match Query(会对查询语句进行分词处理)
Match Query示例如下:
Match Query流程
alfred 与 way的关系
默认情况下,alfred 于 way的关系是or,只要有alfred或者way的文档都会返回。如果需要两者都存在的文档才返回,可以通过配置operator参数来实现。
通过minimum_should_match参数可以控制匹配的单词数
Match Phrase Query(会对查询语句进行分词处理)
对字段作检索,有顺序要求,示例如下:
通过slop参数可以控制单词间的间隔
意为允许java 与 engineer之间有一个term的差异。
Query String Query
类似于URI Search中的q参数查询
Simple Query String Query
类似于Query String,但是会忽略错误的查询语法,并且仅支持部分查询语法。
其常用的逻辑符号如下,不能使用AND、OR、NOT等关键词。
+ 代指AND。
| 代指OR。
- 代指NOT。
Term Query
将查询语句作为整个单词进行查询,即不对查询语句进行分词处理,如下所示:
一次传入多个单词进行查询,如下所示:
Range Query
范围查询主要针对数值和日期类型,如下所示:
针对日期提供一种更友好的计算方式,格式如下:
主要单位有如下几种:
6.符合查询
符合查询是指包含字段类型查询或符合查询的类型,主要包括以下几类:
constant_score query
bool query
dix_max query
function_score query
boosting query
7.constant_score query
该查询将其内部的查询结果文档得分都设定为1或者boost的值
多用于结合bool查询实现自定义得分。
8.bool query
bool查询由一个或多个bool子句组成,主要包含如下四个:
bool query的查询API如下所示:
filter 查询只过滤符合条件的文档,不会进行相关性算分
es针对filter会有智能缓存,因此执行效率很高。
做简单匹配查询且不考虑算分时,推荐使用filter代替query。
must
must_not
should
bool 查询中只包含should,不包含must的查询。
只包含should时,文档必须满足至少一个条件,minimum_should_match参数可以控制满足条件的个数和百分比。
bool 查询中同时包含should和must的查询。
同时包含should和must时,文档不必满足should中的条件,但如果满足会增加相关性得分。
当一个查询语句位于query或者filter上下文时,es的执行结果会有不同,对比如下:
9.count API
获取符合条件的文档数,endpoint为_count
10.Source Filtering
过滤返回结果中_source中的字段,目的是减少网络数据包的大小,主要有一下几种形式:
来源:
https://coding.imooc.com/learn/list/181.html
官方地址:
https://www.elastic.co/guide/en/elasticsearch/reference/6.0/_basic_concepts.html