对“或”和多字段使用多个过滤器

1515

我们有一个带有关键字字段的索引,该字段通常是一个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"
            ]
          }
        }
      ]
    }
  }
}

这将不返回任何记录。我认为是因为它没有将两个过滤器视为“或”。我希望所有与第一个术语查询匹配的记录加上所有与第二个术语查询匹配的记录。实现此目标的最佳方法是什么?希望我的应用程序不需要发送两个单独的请求。

ESCoder

试试下面的查询:

{
  "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
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章