计算数组属性内部元素的个数(包括重复值)

问题描述 投票:0回答:1

鉴于我有以下记录。

[
    {
        "profile": "123",
        "inner": [
            {
                "name": "John"
            }
        ]
    },
    {
        "profile": "456",
        "inner": [
            {
                "name": "John"
            },
            {
                "name": "John"
            },
            {
                "name": "James"
            }
        ]
    }
]

我想要得到类似的东西:

"aggregations": {
    "name": {
        "buckets": [
            {
                "key": "John",
                "doc_count": 3
            },
            {
                "key": "James",
                "doc_count": 1
            }
        ]
    }
}

我是 Elasticsearch 的初学者,这似乎是一个非常简单的操作,但我找不到如何实现这一点。
如果我使用 term 尝试一个简单的 aggs,它会为 John 返回 2,而不是 3。 我正在尝试的请求示例:

{
  "size": 0,
  "aggs": {
    "name": {
      "terms": {
        "field": "inner.name"
      }
    }
  }
}

我怎样才能实现这个目标?
附加信息:稍后将在 Kibana 上使用。 我可以将映射更改为我想要的任何内容,但 AFAIK Kibana 不喜欢“嵌套”类型。 :(

json elasticsearch kibana elastic-stack
1个回答
4
投票

您需要进行

value_count
聚合,默认情况下
terms
只执行
doc_count
,但
value_count
聚合会计算给定字段存在的次数。

因此,为了您的目的:

{
  "size": 0,
  "aggs": {
    "name": {
      "terms": {
        "field": "inner.name"
      },
      "aggs": {
        "total": {
          "value_count": {
            "field": "inner.name"
          }
        }
      }
    }
  }
}

返回:

"aggregations" : {
    "name" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "John",
          "doc_count" : 2,
          "total" : {
            "value" : 3
          }
        },
        {
          "key" : "James",
          "doc_count" : 1,
          "total" : {
            "value" : 2
          }
        }
      ]
    }
  }
© www.soinside.com 2019 - 2024. All rights reserved.