汇总点击量最高的ElasticSearch

时间:2019-05-20 11:26:24

标签: elasticsearch

我的文档的结构如下:

{
   "chefInfo": {
      "id": int,
      "employed": String
      ... Some more recipe information ...
   }
   "recipe": {
      ... Some recipe information ...
   }
}

如果厨师有多个食谱,则每个文档中嵌套的chefInfo块将相同。我的问题是我想对文档的chefInfo部分中的字段进行汇总。但是,这没有考虑到chefInfo块是重复的事实。

因此,如果ID为1的厨师在5个食谱上,而我正在employed字段上进行汇总,则该特定厨师将代表汇总中的5个计数,而我希望他们只算一个。

我考虑过在Chef_id上进行top_hits聚合,然后想对所有存储桶进行子聚合,但是我不知道如何对所有存储桶的结果进行计数桶。

我想做什么?

1 个答案:

答案 0 :(得分:5)

为了具有弹性,每个文档本身都是唯一的。在您的情况下,您想根据不同的字段(此处为chefInfo.id)定义唯一性。要根据此字段查找唯一计数,您必须使用cardinality aggregation

您可以按以下方式应用聚合:

{
  "aggs": {
    "employed": {
      "nested": {
        "path": "chefInfo"
      },
      "aggs": {
        "employed": {
          "terms": {
            "field": "chefInfo.employed.keyword"
          },
          "aggs": {
            "employed_unique": {
              "cardinality": {
                "field": "chefInfo.id"
              }
            }
          }
        }
      }
    }
  }
}

在结果employed_unique中,您会得到期望的计数。