Elasticsearch 6中must_not多条件range查询失效问题求助
问题分析与解决方案
这不是Elasticsearch的Bug,是你在must_not里的range条件逻辑出了问题!
先看你写的第二个查询里的must_not部分:
"must_not":{ "range": { "modelYear":{"gte": 2014, "lt":2010} } }
这个range条件要求modelYear同时满足大于等于2014和小于2010——这根本不可能有任何文档符合这个条件,所以must_not相当于没有排除任何内容,结果自然和不带must_not的查询完全一致。
正确的写法有两种:
方法一:用must直接限定想要的范围(推荐)
既然你想获取2010到2013之间的文档,直接在must里加一个range查询,明确指定范围:
{ "query": { "bool": { "must": [ { "multi_match":{ "query": "ny gammal", "fields": ["title", "description^1.4"], "type": "cross_fields" } }, { "range": { "modelYear": { "gte": 2010, "lte": 2013 } } } ] } } }
这里把两个must条件放在数组里,确保文档同时满足搜索词和年份范围。
方法二:用must_not排除不符合的范围
如果你一定要用must_not,那需要排除的是小于2010或者大于等于2014的文档,这时候需要用bool的should来组合两个range条件(因为must_not里的多个条件是逻辑与,所以要把两个排除条件放在should里,并用minimum_should_match:1确保满足其中一个就被排除):
{ "query": { "bool": { "must":{ "multi_match":{ "query": "ny gammal", "fields": ["title", "description^1.4"], "type": "cross_fields" } }, "must_not": { "bool": { "should": [ { "range": { "modelYear": {"lt": 2010} } }, { "range": { "modelYear": {"gte": 2014} } } ], "minimum_should_match": 1 } } } } }
不过这种写法比第一种更绕,所以更推荐直接用must限定范围的方式。
另外提一句,Elasticsearch 6版本已经停止官方支持很久了,如果条件允许,建议升级到更稳定的新版本哦。
内容的提问来源于stack exchange,提问作者Sahand
相关产品推荐
相关产品推荐

