如何在ElasticSearch上聚合时从数组的正确索引中获取记录?

0yycz8jy  于 2023-04-29  发布在  ElasticSearch
关注(0)|答案(1)|浏览(136)

问题陈述

我有一个ElasticSearch索引,它存储了城市的名称及其ID。它看起来像这样:

{
  "usr" : "plore113"
  "cityName": "New York",
  "cityId": "150p7"
},
{
  "usr" : "plore114"
  "cityName": "Delhi",
  "cityId": "171x9"
}

我正在做一个汇总,把所有城市的名字都收集起来,还有他们的身份证。我通过这个来做到:

{
  "size": 0, 
  "aggs": {
    "cName": {
      "terms": {
        "field": "cityName.keyword",
        "size": 1000
      },
      "aggs": {
        "cId": {
          "terms": {
            "field": "cityId.keyword",
            "size": 1
          }
        }
      }
    }
  }
}

这和预期一样工作,但是现在我有了不同的要求,我现在将cityName和cityId作为数组。(名称和ID将与数组索引Map)。
示例:

cityName: ["New York", "Delhi", "Mumbai"],
cityId: ["150p7", "171x9", "183l0"]

我现在如何使用子聚合来运行接收cityNames及其Id的相同聚合?
先谢谢你了。

vx6bjr1n

vx6bjr1n1#

试试这个,它构建了一个runtime_field来同时过滤cityName和cityId。

{
        "size": 0,
        "runtime_mappings": {
            "city_and_id": {
                "type": "keyword",
                "script": {
                    "source": "emit(doc['cityName.keyword'].value + '-' +  doc['cityId.keyword'].value)"
                }
            }
        },
        "query": {
            "bool": {
                "filter": [
                    {
                        "terms": {
                            "city_and_id": ["Delhi-171x9"]
                        }
                    }
                ]
            }
        },
        "aggs": {
            "cName": {
                "terms": {
                    "field": "cityName.keyword",
                    "size": 1000
                },
                "aggs": {
                    "cId": {
                        "terms": {
                            "field": "cityId.keyword",
                            "size": 1
                        }
                    }
                }
            }
        }
    }

相关问题