Elasticsearch布尔查询组合异常:预期单结果却返回多结果
解决Elasticsearch布尔查询返回过多结果的问题
你的查询返回大量结果的核心原因是嵌套的should子句缺少minimum_should_match参数。默认情况下,当should处于must内部时,Elasticsearch会将should的条件视为可选——也就是说,只要外层must的三个term条件满足,哪怕should里的条件一个都不匹配,文档也会被返回,这显然和你想要的逻辑不符。
正确的查询语句
下面是完全贴合你原始逻辑的查询,我添加了关键的minimum_should_match: 1来确保should里至少有一个条件被匹配:
{ "query": { "bool": { "must": [ { "term": { "country.id": 2000 } }, { "term": { "natureservices.id": 2000 } }, { "term": { "metiers.id": 1000 } }, { "bool": { "should": [ { "term": { "shortname": "shortname" } }, { "term": { "fullname": "fullname" } }, { "term": { "categories.id": 1000 } }, { "term": { "specialities.id": 2000 } } ], "minimum_should_match": 1 } } ] } } }
关键说明
minimum_should_match: 1强制要求嵌套的bool查询必须匹配should数组中的至少一个条件,这样就严格实现了你想要的逻辑:(country.id=2000 AND natureservices.id=2000 AND metiers.id=1000) AND (shortname="shortname" OR fullname="fullname" OR categories.id=1000 OR specialities.id=2000)- 另外要确认你用到的这些字段(比如
shortname、fullname、各类id字段)都是keyword类型,因为term查询是精确匹配,只对keyword类型字段生效。如果是text类型,你可能需要改用match查询或者调整字段映射来实现精确匹配。
内容的提问来源于stack exchange,提问作者Aymen Kanzari
相关产品推荐
相关产品推荐

