本文基于Elasticsearch 6.1 版本学习
Request Body Search
-
将查询语句通过 http request body 发送到es, 主要包含如下参数:
- ...
- query 符合Query DSL 语法查询语句
- from,size
- timeout
- sort
图-1 -
Query DSL
基于json定义的查询语言,主要包含如下两种类型:
- 字段类查询: 如term,match,range等,只针对某一个字段进行查询。
- 复合查询: 如bool查询等, 包含一个或多个字段类查询或符合查询语句。 - 字段类查询主要包括以下两类:
- 全文匹配: 针对text类型的字段进行全文检索,会对查询语句先进行分词处理,如match,match_pharse,等query类型。
- 单词匹配:不会对查询语句做分词处理,直接去匹配字段的倒排索引,如term,terms,range等query类型 -
match Query
对字段作全文检索,最基本和常用的查询类型,API示例如下:match query返回结果match query查询流程
- 通过operator参数可以控制单词间的匹配关系,可选项为or 和 andoperator
- 通过 minimum_should_match 参数可以控制需要匹配的单次数minimum_should_match -
Match phrase Query
对字段作检索,有顺序要求,API示例如下:Match phrase Query响应
- 通过 slop 参数可以控制单词间的间隔slop -
Query String Query
类似于URI Search 中的 q 参数查询Query String QueryQuery String Query -
Simple Query String Query
类似 Query String ,但是会忽略错误的查询语法,并且仅支持部分查询语法,器常用的逻辑符号如下,不能使用AND,OR,NOT 等关键词
+:代指 AND
| :代指 OR
- :代指 NOT
Simple Query String Query -
Term Query
将查询语句作为整个单词进行查询,即不对查询语句做分词处理,如下图所示:Term Query -
Terms Query
一次传入多个单词进行查询,如下图所示:Terms Query -
Range Query
范围查询主要针对数值和日期类型,如下所示:Range Query日期查询日期查询
- y - years
- M - months
- w- weeks
- d - days
- h - hours
- m - minutes
- s - seconds
假设now为2018-01-02 12:00:00,那么如下计算结果为:
计算公式 | 实际结果 |
---|---|
now + 1h | 2018-01-02 13:00:00 |
now - 1h | 2018-01-02 11:00:00 |
now - 1h/d | 2018-01-02 00:00:00 |
-
Bool Query
布尔查询由一个或多个布尔子句组成,主要包含如下4个:
关键词 | 功能 |
---|---|
filter | 只过滤符合条件的文档,不计算相关性得分 |
must | 文档必须符合must中所有条件,会影响相关性算分 |
must_not | 文档必须不符合must_not中的所有条件 |
should | 文档可以符合should中的条件,会影响相关性算分 |
Bool查询的API如下所示:
Bool API
- Filter
es针对filter会有智能缓存,因此其执行效率很高
做简单的匹配查询且不考虑算分时,推荐使用filtrer代替query等
filter
- Must
must
- Must_Not
must_not
- Should
should使用分两种情况:
1. bool查询中只包含should,不包含must查询。只包含should时,文档必须满足至少一个条件,我们通过设置minimum_should_match可以控制满足条件的个数或者百分比
image.png
2. bool查询中同时包含should和must时,文档不必满足should中的条件,但是如果满足条件,会增加相关性算分
image.png
-
Count
获取符合条件的文档数,endpoint为 _count, API及返回结果如下:count -
Source Filtering
过滤返回结果中的 _source中的字段,主要有如下几种方式:Source Filtering -
Sorting(排序)
es默认会采用相关性算分排序,用户可以通过设定 sorting 参数来自定义排序规则,api 如下:排序排序
按照字符串排序比较特殊,因为 es 有 text 和 keyword 两种类型,针对text 类型排序,会报错,如下图所示:排序Fielddata
针对keyword类型排序,可以返回预期的结果:keyword 排序