首页 > 解决方案 > ElasticSearch:何时使用多字段

问题描述

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

来自https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

出于不同目的以不同方式索引同一字段通常很有用。这就是多领域的目的

所以看起来下面的映射对我们来说是有意义的:

{
    "mappings": {
        "my_field": {
            "type": "keyword"
            "fields": {
                "ip": {
                    "type": "ip"
                    "ignore_malformed": true
                }  
            }
        }
    }
}

因此,当我们的应用程序有一组非 IP 地址、IP 地址和 IP 地址的 CIDR 表示法块/范围并需要通过它们查询时,我假设应用程序会将该组拆分为一组具有非 IP 地址另一个带有 ip 地址/CIDR-notation 块,并在我的查询中从它们中生成两个单独的术语过滤器,如下所示:

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

这是对多字段的正确使用吗?我们应该以其他方式实现这一目标吗?它与使用多字段的示例不同,因为它实际上是字段值的子集,而不是全部,因为我使用 ignore_malformed 来丢弃子字段中的非 IP 地址。如果有更好的方法,它是什么?

标签: elasticsearch

解决方案


是的,您对多字段的理解是正确的,您只需要了解您需要显式定义子字段定义(数据类型和分析器)并显式映射它们,以便它使用定义的(数据类型和分析仪)。

现在,一旦以您想要的格式索引数据,您就可以根据您的用例包含/排除子字段。

具有多个分析器的多字段是实现多语言搜索非常常见的一个更好的示例,您可以参考。


推荐阅读