ElasticSearch复杂查询过滤:排除resultat值为1的结果
解决Elasticsearch 2.3.5中剔除
resultat=1结果的问题 你遇到的问题应该是must_not语句的位置或者结构不对,毕竟ES 2.3.5(搭配Lucene 5.5.0)的查询语法和后续版本有差异,filtered查询的结构需要严格遵循规范。
正确的查询结构修改
在你的filtered查询里,需要把排除条件放在filter字段下的bool.must_not中,而且因为resultat是数值字段,要用term做精确匹配(不要用match,match更适合文本字段)。修改后的代码片段如下:
var searchQuery = { index: "resultats_" + env, body: { size: 0, query: { filtered: { query: { match_all: {} }, filter: { bool: { must_not: [ { term: { "resultat": 1 } } ] } } // 这里可以保留你原来的其他过滤条件 } } } };
关键要点说明
- 位置正确:ES 2.x的
filtered查询由query(匹配逻辑)和filter(过滤逻辑,不影响评分)两部分组成,排除条件必须放在filter里的bool.must_not中,才能生效。如果之前你把must_not放在了query块里,可能因为查询逻辑的优先级导致没起作用。 - 用
term匹配数值:resultat是数值字段,term查询会精确匹配数值1,而match查询会做分词处理,对于数值字段来说完全没必要,甚至可能导致匹配异常。 - 兼容性:这个写法完全适配ES 2.3.5版本,不会有语法兼容问题。
验证方法
你可以先简化查询,只保留排除条件,看看是否能正确过滤掉resultat=1的文档,比如运行下面的测试查询:
{ "query": { "filtered": { "query": { "match_all": {} }, "filter": { "bool": { "must_not": [ { "term": { "resultat": 1 } } ] } } } } }
如果这个测试查询能正确排除目标结果,再把你原来的其他查询逻辑加回去就可以了。
内容的提问来源于stack exchange,提问作者Nathan W
相关产品推荐
相关产品推荐

