ElasticSearch-多个字段中的不同元素

5uzkadbs  于 2022-09-20  发布在  ElasticSearch
关注(0)|答案(4)|浏览(190)

我使用ElasticSearch创建了一个Map来索引我的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作为子字符串。DISTINCT项还应包含相应的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}

我尝试使用ElasticSearchterms聚合。

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

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

terms聚合只适用于以下链接的单个字段。

chhqkbe1

chhqkbe11#

我自己找到了答案,是在阅读了Elastic Search 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
      }
    }
  }
}
j0pj023g

j0pj023g2#

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

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

您可以使用许多层的子聚合。

rdlzhqv9

rdlzhqv93#

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

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

需要注意的是,**第一个聚合的作用域是您添加的任何“查询”,而“City”上的第二个聚合的作用域不是而且将是整个数据库。**这可能不是您想要的。

就我个人而言,我认为Ritesh_NITW使用脚本提供的答案具有最好的结果。

2skhul33

2skhul334#

我从谷歌来到这里,搜索如何在Kibana可视化中做到这一点。

看起来Ritesh的答案在这里也很有帮助。

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

在Kibana可视化中,JSON Input字段

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

然而,你必须从里特什的答案中提取一些东西。这只是你需要的script部分。

在我的案例中:

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

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

相关问题