鉴于我有以下记录。
[
{
"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 不喜欢“嵌套”类型。 :(
您需要进行
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
}
}
]
}
}