ElasticSearch中term与match query的选择规则及keyword字段适用场景疑问
Elasticsearch keyword/text类型字段的term与match查询选择说明
核心差异前提
字段类型决定的是索引阶段的词条生成规则,而term和match的差异是查询阶段的处理逻辑,二者是完全独立的流程,哪怕字段是keyword类型,两种查询的行为也不完全一致。
针对keyword类型字段的选择逻辑
你提到的「keyword类型应该始终用term查询」是大部分场景下的最优选择,但不是绝对适用,先明确两种查询在keyword字段下的行为区别:
term是过滤类查询,不对输入的查询字符串做任何处理,直接和倒排索引的词条做精确匹配,默认不计算相关性得分,可走查询缓存,性能更高。match是相关性查询,会先将输入字符串用字段配置的search_analyzer处理(keyword类型默认的搜索分析器为keyword分词器,原样保留输入内容),再做匹配,会计算相关性得分,默认不走缓存,性能略低。
keyword字段使用match查询的适用场景
- 字段配置了自定义
normalizer:比如给keyword字段配置了包含小写转换、特殊字符过滤的normalizer时,match查询会自动将输入内容用同一个normalizer处理后再匹配,不需要业务层手动做字符归一化。例如存储的邮箱为Test@Example.com,normalizer会自动转成小写存入索引,用match查询输入任意大小写的同邮箱地址都能命中,而term查询必须输入完全和索引里一致的小写内容才能命中。 - 多字段联合检索:同时需要匹配text类型和keyword类型字段时,用match可以统一查询语法,也能方便的统一配置多字段的得分权重,可维护性远高于term和match混写。
- 自动处理空白字符:match查询会默认过滤输入字符串的头尾空白字符,比如输入
" 订单123 "会自动处理为"订单123"再匹配,不需要业务层单独做trim操作,而term查询会带着空格直接匹配,大概率无法命中。
针对text类型字段的反向选择逻辑
text类型默认会在索引阶段分词,大部分场景适合用match查询,但以下场景优先用term:
- 精确匹配单个分词词条:比如text类型的文章内容字段,分词后索引里存在
elasticsearch词条,需要精确过滤所有包含该词条的文档、且不需要计算相关性得分时,用term查询性能更高,还能走查询缓存。 - 多字段映射的精确过滤:如果text类型字段同时配置了keyword类型的子字段(如下示例),需要对字段完整值做过滤或聚合统计时,用term查询匹配子字段的效率远高于match。
"title": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }
- 确定性过滤场景:当你明确输入的查询内容就是text字段分词后的单个词条,仅需要做过滤不需要相关性得分时,用term可以跳过查询分词和得分计算步骤,查询效率更高。
内容的提问来源于stack exchange,提问作者Vip
相关产品推荐
相关产品推荐

