elasticsearch 从聚合计算唯一存储桶

dced5bon  于 2023-01-12  发布在  ElasticSearch
关注(0)|答案(1)|浏览(147)

我正在尝试获取一组文档上使用的所有标签的唯一计数。为了做到这一点,并在bucket中返回json(基数不同时返回json和count),我需要编写一个管道查询。
我的查询只完成了一半,但是我遗漏了第二部分,即计算标签所在的桶的数量。
这是我的疑问

{
  "size":0,
  "aggs" : {
     unique_count : {
        "composite" : [
           "metadataId" : {
             "terms" :{"field" : "document.metadata.id"}
           },
           "label" : {
             "terms" :{"field" : "document.label"}
           }
        ]
     }
  }
}

这就产生了

...
"buckets" : [
  {
    "key" : {
      "metadataId" : "1",
      "label" : "label one"
    },
    "doc_count" : 2
  },
  {
    "key" : {
      "metadataId" : "2",
      "label" : "label one"
    },
    "doc_count" : 1
  },
  {
    "key" : {
      "metadataId" : "3",
      "label" : "label three"
    },
    "doc_count" : 3
  }
]
...

我面临的问题是每个bucket都被认为是唯一的,而唯一计数的总和就是我想要返回的值。例如,在上面的bucket中,标签“label one”包含在两个bucket中,因此它的doc_count应该是2,而“label three”的doc_count应该是1。
在管道的最后一个阶段之后,我希望看到以下输出:

"buckets" : [
  {
    "label" : "label one"
    "doc_count" : 2
  },
  {
    "label" : "label three"
    "doc_count" : 1
  }
]

我试过各种方法,但都不能得到我需要的输出。有人能给我指出正确的方向吗?

smdncfj3

smdncfj31#

尝试使用嵌套术语聚合,其中第一级聚合位于label上,第二级聚合位于metadataId字段上。

"aggs" : {
  "labels": {
    "terms": {
      "field": "label.keyword",
      "size": 1000
    },
    "aggs": {
      "metadata": {
        "terms": {
          "field": metadataId.keyword",
          "size": 1000
        }
      }
    }
  }
}

作为输出,您将获得标签存储桶,其中key作为标签值,doc_count具有与该标签匹配的文档计数。每个标签存储桶将具有元数据ID的嵌套存储桶,其中key作为元数据ID值,doc_count具有与该标签和元数据ID匹配的文档计数。

相关问题