如何在Elasticsearch DSL查询中实现not filter反向过滤功能
实现方法
你可以直接使用Elasticsearch Bool查询的must_not子句实现反向过滤,它和filter同属过滤上下文,不会影响文档相关性得分,仅用于排除符合条件的文档。
修改后的完整DSL(Python字典格式):
{'from': 0, 'size': 10, 'aggs': {'products': {'terms': {'field': 'softwares.name.keyword', 'order': {'_key': 'desc'}}}, 'color': {'terms': {'field': 'white.name.keyword', 'order': {'_key': 'desc'}}}, 'types': {'terms': {'field': 'mercedez.name.keyword', 'order': {'_key': 'desc'}}}}, 'query': {'bool': {'must': {'match_all': {}}, 'must_not': [{'term': {'name.keyword': 'Germany'}}]}}}
改动说明
- 仅将原
filter数组内的正向term查询,移动到bool查询下的must_not数组中即可,原有分页、聚合逻辑完全不需要调整 - 如果你同时还有其他需要保留的正向过滤条件,
filter和must_not可以共存,示例如下:
# 同时正向过滤status为1,反向排除name为Germany的示例 {'from': 0, 'size': 10, 'aggs': {'products': {'terms': {'field': 'softwares.name.keyword', 'order': {'_key': 'desc'}}}, 'color': {'terms': {'field': 'white.name.keyword', 'order': {'_key': 'desc'}}}, 'types': {'terms': {'field': 'mercedez.name.keyword', 'order': {'_key': 'desc'}}}}, 'query': {'bool': {'must': {'match_all': {}}, 'filter': [{'term': {'status': 1}}], 'must_not': [{'term': {'name.keyword': 'Germany'}}]}}}
内容的提问来源于stack exchange,提问作者sim
相关产品推荐
相关产品推荐

