Elasticsearch查询:如何仅匹配name字段值为"cat"的文档?
精确匹配"cat"的解决方案
你遇到的问题是因为Elasticsearch默认对text类型字段做分词处理——"cat is white"这类字符串会被拆成cat、is、white三个独立分词,所以match或普通term查询会命中所有包含cat分词的文档。要只返回name值恰好为"cat"的结果,有以下几种实用方案:
方案1:用keyword子字段做term查询
如果你的name字段是默认的text类型(Elasticsearch会自动生成name.keyword这个keyword类型的子字段,该字段存储原始未分词的字符串),直接用term查询这个子字段即可:
GET animals/_search { "query": { "term": { "name.keyword": "cat" } } }
方案2:修改字段映射为keyword类型
如果不需要对name做全文检索,可直接将其类型改为keyword(该类型不会对字符串分词,完整存储原始值)。先修改映射:
PUT animals/_mapping { "properties": { "name": { "type": "keyword" } } }
修改后需要重新索引数据,之后用普通的match或term查询就能精准匹配:
GET animals/_search { "query": { "match": { "name": "cat" } } }
方案3:match_phrase短语查询(备选)
通过match_phrase设置slop:0,强制完全匹配短语:
GET animals/_search { "query": { "match_phrase": { "name": { "query": "cat", "slop": 0 } } } }
不过这种方式依赖分词结果,仅当目标内容是单个词时有效,稳定性不如keyword字段的精确匹配。
内容的提问来源于stack exchange,提问作者Ismeet
相关产品推荐
相关产品推荐

