首页 > 解决方案 > 使用多个“术语”和一个列表的 ElasticSDL 查询

问题描述

我正在尝试形成一个查询来匹配来自或到特定 IP 地址的所有连接。 我的日志包含 SRC_ip 和 DST_ip。

我不想使用两个查询或查询的重复部分太多,因为它会很长而且编辑起来不太清楚。

例如,下面是如何实现我需要的 IP 地址 1.1.1.1、1.1.1.2。这个查询工作正常,但如果我想检查数百个 IP,它会太长而且不容易经常编辑。

{
  "query": {
    "bool": {
      "should": [
        {
          "match_phrase": {
            "src_ip": "1.1.1.1"
          }
        },
        {
          "match_phrase": {
            "dst_ip": "1.1.1.1"
          }
        },
        {
          "match_phrase": {
            "src_ip": "1.1.1.2"
          }
        },
        {
          "match_phrase": {
            "dst_ip": "1.1.1.2"
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

我正在寻找的理想解决方案看起来像这样,但将包含 [] 中一个列表中的 src_ip 或 dst_ip 地址。

{
  "query": {
    "bool": {
      "filter": {
        "terms": {
          "src_ip": [
            "1.1.1.1",
            "1.1.1.2",
            .....etc....
          ]
        }
      }
    }
  }
}

在文档中,我没有找到任何方法来组合术语。有什么建议我可以同时为两者编写一些漂亮的查询吗?像这样的东西:

"terms": {
          "src_ip" OR "dst_IP" : [1.1.1.1,1.1.1.2,1.1.1.3,1.1.1.4]
    }

标签: elasticsearchelasticsearch-dsl

解决方案


您可以利用查询字符串查询,例如:

{
  "query": {
    "bool": {
      "filter": {
        "query_string": {
          "query": "1.1.1.1 OR 1.1.1.2 OR 1.1.1.3",
          "fields": [
            "src_ip",
            "dst_ip"
          ]
        }
      }
    }
  }
}

另请记住,IP 地址有一个专用的映射类型,它允许您运行可以保存的范围查询 ( https://www.elastic.co/guide/en/elasticsearch/reference/7.13/range.html )如果您对连续地址感兴趣,请提供一些样板文件。


推荐阅读