Elasticsearch(ES)作为功能强大的检索引擎,提供了多种查询方式,在不同的场景下需要选择合适的查询方式以取得最佳查询效果。
ES常用查询方式
方式 | 说明 |
---|---|
Match Query(匹配查询) | 根据字段的内容进行全文匹配查询,可以使用match 、match_all 、multi_match 等 |
Term Query (精确查询) | 根据字段的精确值进行查询,适用于keyword类型(直接在字段中查找条件值)或者已经执行过分词的字段(在倒排索引中查找条件值),可以使用term 和terms |
Range Query(范围查询) | 根据字段的范围值行查询,可以用来查询数字或日期范围,例如大于、小于、范围内等 |
Bool Query (布尔查询) | 通过逻辑运算符(must 、must_not 、should )组合多个查询条件,实现更复杂的查询逻辑 |
Match Phrase Query(短语匹配查询) | 根据字段中连续的短语进行查询,适用于需要保持短语顺序的查询 |
Prefix Query(前缀查询) | 根据字段的文本前缀进行查询,适用于需要按照前缀匹配查询的场景 |
Wildcard Query(通配符查询) | 使用通配符模式进行查询,支持通配符符号(*和?)进行模糊匹配 |
Fuzzy Query(模糊查询) | 根据字段中的模糊匹配进行查询,可以通过设置fuzziness参数来控制模糊程度 |
Nested Query(嵌套查询) | 嵌套对象进行查询,即查询使用的条件本身也是查询,以便查询嵌套在文档中的相关信息 |
Aggregation Query(聚合查询) | 用于计算、统计和分析数据,包括求和、平均值、最小值、最大值、分组等操作 |
除了这些常用的查询方式,还有正则表达式查询、复杂查询、地理位置查询等其他查询方式,详见官方文档,这里不再赘述(参考文献第2篇有一个列表,但可能不是最全的)。
Match查询
下面简单介绍一下最常用的match查询方式
Match查询属于全文(full text)查询,不同于Term查询,ES引擎在处理全文搜索时,首先会分析(analyze)查询字符串,然后根据分词结果构建查询,最终发返回查询结果。
匹配查询共有三种类型,分别是布尔(boolean)、短语(phrase)和短语前缀(phrase_prefix),默认的匹配查询是布尔类型,ES引擎首先分析查询字符串,使用指定的分析器对查询字符串进行分词,然后根据分词结果构建一个默认逻辑的布尔查询,例如对于以下查询:
json
"query":{
"match":{
"name":"Steve Wang"
}
}
查询字符串为Steve Wang
,分词结果为Steve
、Wang
,查询时的逻辑是,只要name
字段包含Steve
或者Wang
任意一个关键字,就返回该文档,等价于如下语句:
json
{
"query": {
"match": {
"name": {
"query": "Steve Wang",
"operator": "or",
"minimum_should_match": 1
}
}
}
}
其中operator
和minimum_should_match
是匹配查询的两个控制参数,通过调整operator
和minimum_should_match
属性值,控制匹配查询的逻辑条件,进而控制引擎返回的结果。默认情况下operator
的值是or,minimum_should_match
的值是1即包含任意1个关键字,视为匹配成功。也可以更改operator
的为and,minimum_should_match
为任意非0自然数或者百分比,表示同时匹配minimum_should_match
个关键字或者匹配到的关键字占比达到多少视为匹配成功。
进一步的,如果match匹配时未进行分词(keyword类型),或者text类型但分词结果为1(此时和未分词结果相同),执行的是term查询 ,如果分词得到多个词,则执行terms查询。