ElasticSearch:何时使用多字段

b15*_*b15 6 elasticsearch

我们有一个带有关键字字段的索引,该字段通常是 ​​IP 地址,但并非总是如此。我们希望不仅可以使用关键字,还可以使用 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
                }  
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,当我们的应用程序有一组非 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"
            ]
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*wal 4

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

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

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

  • 如果这是多字段的正确使用,我将继续并接受这个答案。 (2认同)