【问题标题】:Elastic Search- Distinct elements from multiple fields弹性搜索 - 来自多个字段的不同元素
【发布时间】:2020-12-15 22:07:02
【问题描述】:

我使用弹性搜索创建了一个映射来索引我的mongoDb 集合。这是mapping 属性:

"properties" : {
          "address_components" : {
            "properties" : {
              "_id" : {
                "type" : "string"
              },
              "subLocality1" : {
                "type" : "string",
                "index" : "not_analyzed"
              },
              "subLocality2" : {
                "type" : "string",
                "index" : "not_analyzed"
              },
              "subLocality3" : {
                "type" : "string",
                "index" : "not_analyzed"
              }, 
             "city" : {
                "type" : "string",
                "index" : "not_analyzed"
              }
            }

现在,我想从这些字段中检索整体唯一项:subLocality1subLocality2subLocality3city。 此外,每个distinct 值都应包含q 作为子字符串。 不同的项目还应该包含对应的city 值。

例子:

"address_components" : {
    "subLocality1" : "s1"
    "subLocality2" : "s1",
    "subLocality3" : "s2",
    "city":"a"
  }

"address_components" : {
    "subLocality1" : "s3"
    "subLocality2" : "s1",
    "subLocality3" : "s2",
    "city":"a"
  }

"address_components" : {
    "subLocality1" : "s2"
    "subLocality2" : "s1",
    "subLocality3" : "s4",
    "city":"a"
  }

对于上述索引, 预期结果是:

"address_components" : {
    "subLocality1" : "s1"
    "subLocality2" : "s1",
    "subLocality3" : "s2",
    "city":"ct1"
  }

"address_components" : {
    "subLocality1" : "s3"
    "subLocality2" : "s1",
    "subLocality3" : "s2",
    "city":"ct1"
  }

"address_components" : {
    "subLocality1" : "s2"
    "subLocality2" : "s1",
    "subLocality3" : "s4",
    "city":"ct1"
  }
{s1, a}, {s2,a}, {s3,a}, {s4,a},{a,a}

我尝试使用弹性搜索 terms 聚合来做到这一点。

GET /rescu/rescu/_search?pretty=true&search_type=count

{
    "aggs" : {
        "distinct_locations" : {
            "terms" : {
                "script" : "doc['address_components.subLocality1'].value"
            }
        }
    }
}

terms 聚合仅适用于单个字段,根据以下link

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    在浏览弹性搜索 API 文档后,我自己找到了答案。 我们需要使用脚本从多个字段中检索术语。

    GET /rescu/rescu/_search?pretty=true&search_type=count

    {
      "aggs": {
        "distinct_locations": {
          "terms": {
            "script": "[doc['address_components.subLocality1'].value,doc['address_components.subLocality2'].value,doc['address_components.subLocality3'].value]",
            "size": 5000
          }
        }
      }
    }
    

    【讨论】:

      【解决方案2】:

      下面是两个字段的示例:国家、城市。它使用按国家/地区的聚合和按城市的子聚合:

      {
        "size": 0,
        "aggs": {
          "country": {
            "terms": {
              "field": "country"
            },
            "aggregations": {
              "city": {
                "terms": {
                  "field": "city"
                }
              }
            }
          }
        }
      }
      

      您可以使用多层子聚合。

      【讨论】:

        【解决方案3】:

        如果您使用 Fuad Efendi 提供的查询:

        {
          "size": 0,
          "aggs": {
            "country": {
              "terms": {
                "field": "country"
              },
              "aggregations": {
                "city": {
                  "terms": {
                    "field": "city"
                  }
                }
              }
            }
          }
        }
        

        请务必注意,第一个聚合将作用于您添加的任何“查询”,但“城市”的第二个聚合不会,而是将作用于整个数据库。这可能不是你想要的。

        就个人而言,我发现 ritesh_NITW 使用脚本提供的答案,以获得最佳结果。

        【讨论】:

          【解决方案4】:

          我来自谷歌搜索如何在 Kibana 可视化中执行此操作。

          看起来Riteshanswer 在那里也很有帮助。

          我想对两个字段进行唯一计数聚合:IPAddressMessage

          在 Kibana 可视化中,JSON Input 字段

          帮助您修改发送到 ElasticSearch 的查询的聚合部分。

          但是,您必须从 Ritesh 的答案中提取一些内容。这只是您需要的script 部分。

          就我而言:

          {
              "script": "[doc['extra.IPAddress'].value,doc['extra.Message'].value]"
          }
          

          现在,documentation 中真正缺少的是script 参数优先于field 参数。这就是在 Kibana 中发生的事情。接口发送field参数,发送script参数是因为你在JSON input文本框中添加的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-29
            • 2020-09-11
            • 2015-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-03-21
            • 2021-10-16
            相关资源
            最近更新 更多