ES无法修改mapping的text字段如何用match查询精准匹配完整词组
问题原因分析
- 你配置
"operator" : "and"后无返回的直接原因是搜索词拼写错误:你写的是united statess(多了末尾的s),正确拼写应为united states,拼写错误导致没有任何文档同时命中united和statess两个分词,因此无结果。 - 未加
operator:and时返回两类结果的原因是默认match查询用or逻辑,只要命中任意一个分词就会返回,两个地名都包含united分词,因此全部命中。
实现方案
方案1:使用match查询(符合需求的原生实现)
修正拼写+添加operator:and即可实现需求,该配置要求搜索词拆分后的所有分词都必须在目标字段中存在,不会出现只命中公共分词united就返回的问题。
单关键词查询示例:
{ "query": { "match": { "location": { "query": "united states", "operator": "and" } } } }
如果需要同时查询united states或united kingdom任意一个,使用bool查询嵌套两个match子句即可:
{ "query": { "bool": { "should": [ { "match": { "location": { "query": "united states", "operator": "and" } } }, { "match": { "location": { "query": "united kingdom", "operator": "and" } } } ], "minimum_should_match": 1 } } }
方案2:更高精度的match_phrase查询(可选)
如果你需要保证两个词是连续出现(避免字段中存在united和states但中间间隔其他内容的误匹配),可以用match_phrase查询,不需要额外配置operator,默认要求短语连续匹配:
{ "query": { "match_phrase": { "location": "united states" } } }
内容的提问来源于stack exchange,提问作者Max101
相关产品推荐
相关产品推荐

