elasticsearch,Java,elasticsearch" /> elasticsearch,Java,elasticsearch" />

Java 使用带或和多字段的多个过滤器

Java 使用带或和多字段的多个过滤器,java,elasticsearch,Java,elasticsearch,我们有一个带有关键字字段的索引,它通常是一个ip地址,但并不总是这样。我们希望能够在该字段上搜索该索引,不仅使用关键字,还使用CIDR表示法,该表示法仅支持“ip”类型的字段。表面上看,这看起来像是多字段的用例,因此我们有一个带有映射的索引: { "mappings": { "my_field": { "type": "keyword" &quo

我们有一个带有关键字字段的索引,它通常是一个ip地址,但并不总是这样。我们希望能够在该字段上搜索该索引,不仅使用关键字,还使用CIDR表示法,该表示法仅支持“ip”类型的字段。表面上看,这看起来像是多字段的用例,因此我们有一个带有映射的索引:

{
    "mappings": {
        "my_field": {
            "type": "keyword"
            "fields": {
                "ip": {
                    "type": "ip"
                    "ignore_malformed": true
                }  
            }
        }
    }
}
因此,当我们的应用程序有一组非ip地址、ip地址和CIDR标记块/ip地址范围并需要通过它们进行查询时,我们的应用程序会将这些集合拆分为一组具有非ip地址的集合和另一组具有ip地址/CIDR标记块的集合,并在我的查询中对它们进行两个单独的术语筛选,如下所示:

{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "my_field.ip": [
              "123.123.123.0/24",
              "192.168.0.1",
              "192.168.16.255",
              "192.169.1.0/24"
            ]
          }
        },
        {
          "terms": {
            "my_field": [
              "someDomain.com",
              "notAnIp.net"
            ]
          }
        }
      ]
    }
  }
}

这不会返回任何记录。我想是因为它没有把这两个过滤器当作OR。我要匹配第一个术语查询的所有记录加上匹配第二个术语查询的所有记录。实现这一目标的最佳方式是什么?希望我的应用程序不需要发送两个单独的请求。

尝试以下查询:

{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "filter": {
              "terms": {
                "my_field.ip": [
                  "123.123.123.0/24",
                  "192.168.0.1",
                  "192.168.16.255",
                  "192.169.1.0/24"
                ]
              }
            }
          }
        },
        {
          "bool": {
            "filter": {
              "terms": {
                "my_field": [
                  "someDomain.com",
                  "notAnIp.net"
                ]
              }
            }
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}

您误解了filter子句,它将过滤布尔查询中没有
should
must
子句的文档,有关详细信息,请参阅

当您使用带有筛选器的
should
must
子句时,其含义将发生变化,并将开始返回文档,请参阅@ESCoder answer了解如何实现

另外请注意,由于您仅使用筛选子句,因此不会计算分数,并且搜索结果中的所有文档的分数都将与
0
相同,这可能不是您想要的,如果您希望进行评分,则需要使用查询子句