一、全文检索查询 (Full Text Queries)
这类查询用于搜索文本内容,会对查询语句进行分词处理,适用于 text 类型的字段。
-
multi_match-
功能:在多个字段上执行相同的
match查询。 -
示例:同时在
title和content字段中搜索关键词。
json
{ "query": { "multi_match": { "query": "quick brown fox", "fields": ["title", "content"] } } } -
-
match_phrase-
功能:匹配包含完全相同且顺序一致的短语的文档。它考虑了单词的顺序。
-
示例:精确匹配短语 “quick brown fox”。
json
{ "query": { "match_phrase": { "message": "quick brown fox" } } } -
-
match_phrase_prefix-
功能:与
match_phrase类似,但允许对最后一个词项进行前缀匹配(即通配符搜索)。 -
示例:匹配以 “quick brown f” 开头的短语,用于实现搜索建议。
json
{ "query": { "match_phrase_prefix": { "message": "quick brown f" } } } -
-
query_string-
功能:支持复杂的、紧凑的Lucene查询字符串语法,允许使用 AND, OR, NOT, 通配符
*, 模糊匹配~等操作符在一个查询字符串中表达复杂逻辑。 -
注意:非常强大但也很危险(语法严格易出错),通常不推荐用于用户直接输入(有注入风险)。
json
{ "query": { "query_string": { "default_field": "content", "query": "(elasticsearch AND learning) OR (kibana tutorial)" } } } -
-
simple_query_string-
功能:
query_string的一个更安全、更简单的版本。它会忽略无效的语法部分而不是直接报错,更适合暴露给用户直接使用。
json
{ "query": { "simple_query_string": { "query": "elasticsearch -kibana", "fields": ["content"], "default_operator": "and" } } } -
二、词项级查询 (Term-level Queries)
这类查询用于精确匹配未经分词的精确值,如数字、日期、关键字(keyword),不进行评分(只关心是否匹配),通常用于过滤。
-
exists-
功能:查找包含指定字段(且该字段值不为
null或空数组)的文档。
json
{ "query": { "exists": { "field": "user" } } } -
-
prefix-
功能:查找在指定字段中包含以给定前缀开头的词项的文档。
json
{ "query": { "prefix": { "user": "ki" // 匹配 "kimchy", "kirk", 等 } } } -
-
wildcard-
功能:使用通配符进行匹配。
*代表多个字符,?代表一个字符。 -
注意:通配符查询在大型索引上可能很慢,尽量避免以
*或?开头。
json
{ "query": { "wildcard": { "user": "ki*y" // 匹配 "kimchy", "kirkby", 等 } } } -
-
regexp-
功能:使用正则表达式进行匹配。功能最强大,但性能代价也最高。
json
{ "query": { "regexp": { "user": "k[ie].*y" } } } -
-
fuzzy-
功能:匹配与搜索词项相似(允许一定程度的拼写错误/编辑距离)的文档。基于Levenshtein编辑距离。
json
{ "query": { "fuzzy": { "user": { "value": "ki", // 可能会匹配 "kimchy", "kirk", "cie" 等 "fuzziness": "AUTO" } } } } -
-
ids-
功能:根据文档的
_id字段来查询文档。
json
{ "query": { "ids": { "values": ["1", "2", "3"] } } } -
三、复合查询 (Compound Queries)
这类查询可以将其它查询组合起来,实现复杂的逻辑。
-
bool(这是最重要的复合查询)-
功能:将多个查询子句通过逻辑关系组合在一起。
-
子句:
-
must:必须匹配,贡献得分 (AND) -
filter:必须匹配,但不贡献得分(性能更高,常用于过滤) -
should:应该匹配(满足其中一部分即可,与minimum_should_match参数配合使用)(OR) -
must_not:必须不匹配,不贡献得分 (NOT)
-
json
{ "query": { "bool": { "must": [ { "match": { "title": "elasticsearch" } } ], "filter": [ { "range": { "date": { "gte": "2023-01-01" } } }, { "term": { "status": "published" } } ], "must_not": [ { "term": { "tags": "experimental" } } ], "should": [ { "match": { "content": "performance" } }, { "match": { "content": "scalability" } } ], "minimum_should_match": 1 } } } -
-
boosting-
功能:返回匹配
positive查询的文档,但同时降低也匹配negative查询的文档的得分。
json
{ "query": { "boosting": { "positive": { "match": { "text": "apple" } }, "negative": { "match": { "text": "pie" } }, "negative_boost": 0.5 // 匹配 negative 子句的文档,其得分会乘以 0.5 } } } -
四、地理查询 (Geo Queries)
用于基于地理坐标的搜索。
-
geo_distance-
功能:查找距离某个中心点一定距离内的所有文档。
json
{ "query": { "geo_distance": { "distance": "200km", "pin.location": { "lat": 40, "lon": -70 } } } } -
-
geo_bounding_box-
功能:查找位于一个矩形框内的所有文档。
json
{ "query": { "geo_bounding_box": { "pin.location": { "top_left": { "lat": 40.73, "lon": -74.1 }, "bottom_right": { "lat": 40.01, "lon": -71.12 } } } } } -
五、特殊查询 (Specialized Queries)
-
script-
功能:使用脚本(如 Painless)来自定义查询逻辑,功能极其强大,但性能开销大。
json
{ "query": { "script": { "script": { "source": "doc['price'].value > params.threshold", "params": { "threshold": 100 } } } } } -
-
percolate-
功能:反向查询。不是根据查询找文档,而是根据文档(存储的查询)找哪些查询会被该文档匹配。常用于告警系统或内容推荐(“为我保存这篇文章”)。
-
六、跨度查询 (Span Queries)
用于非常精确地控制词项的顺序和位置关系,常用于法律或专利文档的高精度检索。
-
span_near,span_term,span_first等。
总结
| 类别 | 常用查询 | 用途 |
|---|---|---|
| 全文检索 | multi_match, match_phrase, query_string | 在文本中搜索关键词或短语 |
| 词项级 | exists, prefix, wildcard, fuzzy | 精确匹配、过滤、前缀/模糊搜索 |
| 复合查询 | bool (最重要) | 组合多个查询,实现 AND/OR/NOT 逻辑 |
| 地理查询 | geo_distance, geo_bounding_box | 基于地理位置搜索 |
| 特殊查询 | script, percolate | 自定义脚本逻辑、反向查询 |
bool 复合查询是构建复杂、高效 Elasticsearch 搜索功能的关键。bool 查询的 filter 上下文因其不计算得分和可缓存的特点,被广泛用于提高查询性能。
1245

被折叠的 条评论
为什么被折叠?



