Elasticsearch如何在filter子句下正确使用must_not实现不等于过滤
报错原因
must_not 是 bool 复合查询的专属子参数,不是可以独立使用的查询类型。你直接将must_not作为元素放入filter数组时,Elasticsearch 会将其识别为一个待解析的独立查询,找不到匹配的查询解析器,就会抛出[bool] failed to parse field [filter]错误。
你之前将must_not移到外层bool层级、与filter平级的写法本身是合法的,但如果需要把「不等于」逻辑完全收敛在filter内部(比如适配复杂的嵌套过滤规则),可以通过嵌套bool查询实现。
filter 内实现不等于的正确写法
在filter数组中嵌套一层bool查询,将must_not作为这个内层bool的子句即可,和其他平级的filter条件一样,该逻辑运行在filter上下文,不会计算相关性得分,性能和普通过滤查询一致:
"query": { "bool": { "filter": [ { "bool": { "must_not": { "term": { "status": "DECLINED" } } } }, { "term": { "type": "ORDER" } } ] } }
补充说明
- 两种合法写法(
must_not在外层bool平级、must_not在内层filter的bool中)的执行效果完全一致,都会过滤掉status为DECLINED的文档,且都不参与相关性算分。 - 内层嵌套bool的写法适配性更强,当你需要实现多组逻辑组合(比如「满足A不等于B且C等于D,或者满足E等于F」)时,必须通过嵌套bool的方式组织子句。
内容的提问来源于stack exchange,提问作者Joey Yi Zhao
相关产品推荐
相关产品推荐

