Python编写Elasticsearch DSL时如何实现多个must_not查询条件
根因说明
你遇到的问题本质是Python字典不允许同层级存在重复键,你在同一个bool查询结构下定义了两次must_not键,后定义的会自动覆盖先定义的内容,因此只有最后一个过滤条件生效。
Elasticsearch的bool查询中,must_not本身就支持传入数组来配置多个并行的排除规则,无需重复写must_not键,同时你原有的嵌套should结构属于冗余写法,直接在外层bool下配置must_not即可满足需求。
正确DSL代码
{ "query": { "bool": { "must": { "regexp": { "ciscoDstIP": "192.168.81.*" } }, "must_not": [ { "regexp": { "ciscoSrcIP": "192.168.*" } }, { "regexp": { "ciscoSrcIP": "10.*" } } ] } } }
Python生成对应查询的写法
es_query = { "query": { "bool": { "must": {"regexp": {"ciscoDstIP": "192.168.81.*"}}, "must_not": [ {"regexp": {"ciscoSrcIP": "192.168.*"}}, {"regexp": {"ciscoSrcIP": "10.*"}} ] } } }
优化建议
如果你的IP字段在Elasticsearch中是
ip类型,推荐使用CIDR网段匹配替代正则查询,性能会有明显提升:{ "query": { "bool": { "must": [ {"term": {"ciscoDstIP": "192.168.81.0/24"}} ], "must_not": [ {"term": {"ciscoSrcIP": "192.168.0.0/16"}}, {"term": {"ciscoSrcIP": "10.0.0.0/8"}} ] } } }
内容的提问来源于stack exchange,提问作者disney82231
相关产品推荐
相关产品推荐

