ElasticSearch中term匹配text、match匹配keyword的执行逻辑咨询
ElasticSearch 查询行为解析:term匹配text字段与match匹配keyword字段的差异
测试用DSL代码
# 创建索引库的DSL语句 PUT /mytest { "mappings": { "properties": { "someText1": { "type": "text" }, "someText2": { "type": "keyword" } } } } # 添加一条数据 POST /mytest/_doc/1 { "someText1": "Hello World", "someText2": "Hello World" } # 使用'term'匹配text类型字段,查询结果为空 GET /mytest/_search { "query": { "term": { "someText1": "Hello World" } } } # 使用'match'匹配keyword类型字段,查询结果包含上述数据 GET /mytest/_search { "query": { "match": { "someText2": "Hello World" } } }
问题
请问ElasticSearch会如何执行上述两个查询?
我原本认为,当使用match匹配keyword类型字段时,match会使用standard分词器拆分输入内容,再匹配keyword的倒排索引,结果集应该为空,但实际并非如此,想了解其中原因。
执行逻辑解析
1. term查询匹配text字段(结果为空)
- 写入阶段:
text类型的someText1字段会被默认的standard分词器处理,将"Hello World"拆分为两个小写词条:hello、world,倒排索引中仅存储这两个词条。 - 查询阶段:
term是精确匹配查询,不会对输入的"Hello World"做分词处理,直接用完整字符串去倒排索引中查找。由于索引里不存在该完整词条,因此返回空结果。
2. match查询匹配keyword字段(结果命中)
你的核心误解在于:match查询的分词规则是由目标字段的类型决定的,而非固定使用standard分词器。
- 写入阶段:
keyword类型的someText2字段不会做分词处理,倒排索引中存储的是完整的原始字符串"Hello World"。 - 查询阶段:当
match作用于keyword字段时,ES会自动使用该字段绑定的keyword分词器——这个分词器不会拆分输入,只会原样保留整个字符串。因此查询输入"Hello World"会被处理为单个完整词条,和索引中的内容完全匹配,最终命中数据。
验证分词行为
可以通过_analyze API直观查看不同分词器的处理结果:
# 查看standard分词器处理结果(对应text字段) POST /_analyze { "analyzer": "standard", "text": "Hello World" } # 输出结果:["hello", "world"] # 查看keyword分词器处理结果(对应keyword字段) POST /_analyze { "analyzer": "keyword", "text": "Hello World" } # 输出结果:["Hello World"]
内容的提问来源于stack exchange,提问作者Daiwting
相关产品推荐
相关产品推荐

