You need to enable JavaScript to run this app. Python编写Elasticsearch DSL时如何实现多个must_not查询条件
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 17:36:03