列出es查询match、term、wildcard、prefix、fuzzy、range、query_string、text、missing的区别及用法
1. match
查询
-
用途:全文搜索,对查询文本进行分词后匹配。
-
分析器处理:会使用字段映射的分析器处理查询文本。
-
适用字段:
text
类型字段(分词后的文本)。 -
示例:
json
复制
下载
GET /_search {"query": {"match": {"content": "quick brown fox"}} }
-
注意:支持模糊匹配、运算符(如
AND/OR
)和权重设置。
2. term
查询
-
用途:精确匹配未经分词的词项。
-
分析器处理:不分析查询词,直接匹配字段的原始值。
-
适用字段:
keyword
类型字段或未分词的字段。 -
示例:
json
复制
下载
GET /_search {"query": {"term": {"status.keyword": "published"}} }
-
注意:若字段是
text
类型,需用.keyword
子字段。
3. wildcard
查询
-
用途:通配符匹配(支持
*
和?
)。 -
分析器处理:不分析查询词。
-
适用字段:
keyword
类型字段。 -
示例:
json
复制
下载
GET /_search {"query": {"wildcard": {"title.keyword": "el*stic"}} }
-
注意:通配符在前缀(如
*test
)时性能较差,慎用。
4. prefix
查询
-
用途:匹配以指定前缀开头的词项。
-
分析器处理:不分析查询词。
-
适用字段:
keyword
类型字段。 -
示例:
json
复制
下载
GET /_search {"query": {"prefix": {"tag.keyword": "el"}} }
-
注意:适合自动补全场景,但需注意索引设计。
5. fuzzy
查询
-
用途:模糊匹配,允许拼写错误(基于编辑距离)。
-
分析器处理:不分析查询词。
-
适用字段:
keyword
或text
(需结合.keyword
)。 -
示例:
json
复制
下载
GET /_search {"query": {"fuzzy": {"author.keyword": {"value": "schwarzenegger","fuzziness": 2}}} }
-
注意:
fuzziness
参数控制最大允许编辑距离。
6. range
查询
-
用途:范围查询(数值、日期等)。
-
分析器处理:不分析查询词。
-
适用字段:数值、日期、字符串(按字典序)。
-
示例:
json
复制
下载
GET /_search {"query": {"range": {"price": {"gte": 100,"lte": 500}}} }
-
注意:支持
gt
/gte
/lt
/lte
操作符。
7. query_string
查询
-
用途:支持复杂查询语法(如布尔逻辑、通配符)。
-
分析器处理:默认使用字段的分析器。
-
适用字段:
text
或keyword
类型。 -
示例:
json
复制
下载
GET /_search {"query": {"query_string": {"query": "(error OR warn) AND service:nginx"}} }
-
注意:语法复杂,需防范注入攻击,生产环境慎用。
8. text
查询
-
说明:Elasticsearch 没有单独的
text
查询类型,通常指对text
类型字段使用match
查询。 -
正确用法:
json
复制
下载
GET /_search {"query": {"match": {"content": "search text"}} }
9. missing
查询(已废弃)
-
用途:查找缺失某字段的文档(ES 7.0+ 已移除,改用
exists
反向查询)。 -
替代方案:
json
复制
下载
GET /_search {"query": {"bool": {"must_not": {"exists": {"field": "optional_field"}}}} }
对比总结
查询类型 | 分词处理 | 适用场景 | 性能注意 |
---|---|---|---|
match | ✔️ | 全文搜索 | 高效,支持复杂逻辑 |
term | ✖️ | 精确匹配(如状态、标签) | 需字段为 keyword |
wildcard | ✖️ | 通配符匹配(少量前缀) | 避免前缀通配符 * |
prefix | ✖️ | 前缀匹配(自动补全) | 适合有限前缀场景 |
fuzzy | ✖️ | 容错搜索(拼写错误) | 控制 fuzziness |
range | ✖️ | 数值/日期范围过滤 | 数值字段优化更好 |
query_string | ✔️ | 复杂语法搜索(开发调试用) | 避免直接暴露给用户 |
missing | ✖️ | 查找缺失字段(旧版本) | 使用 exists 替代 |
使用建议
-
优先选择
match
和term
:覆盖大部分全文和精确匹配需求。 -
慎用通配符:
wildcard
和prefix
在大型索引中可能影响性能。 -
数值/日期范围:使用
range
查询时确保字段类型正确。 -
模糊查询:合理设置
fuzziness
避免过多噪声结果。 -
字段类型敏感:区分
text
(分词)和keyword
(未分词)的使用场景。