索引文档如下:
{
id: 1,
title: 'Blah',
...
platform: {id: 84, url: 'http://facebook.com', title: 'Facebook'}
...
}
Run Code Online (Sandbox Code Playgroud)
我想要的是按平台计算和输出统计数据.对于计数,我可以使用术语聚合platform.id作为字段来计算:
aggs: {
platforms: {
terms: {field: 'platform.id'}
}
}
Run Code Online (Sandbox Code Playgroud)
这样我就可以像{key: 8, doc_count: 162511}预期的那样收到像多个桶一样的统计数据.
现在,我可以以某种方式添加到那些桶platform.name和platform.url(对于漂亮的统计输出)?我带来的最好看起来像:
aggs: {
platforms: {
terms: {field: 'platform.id'},
aggs: {
name: {terms: {field: 'platform.name'}},
url: {terms: {field: 'platform.url'}}
}
}
}
Run Code Online (Sandbox Code Playgroud)
事实上,它可以工作,并在每个桶中返回相当复杂的结构:
{key: 7,
doc_count: 528568,
url:
{doc_count_error_upper_bound: 0,
sum_other_doc_count: 0,
buckets: [{key: "http://facebook.com", doc_count: 528568}]},
name:
{doc_count_error_upper_bound: 0,
sum_other_doc_count: 0,
buckets: [{key: "Facebook", doc_count: 528568}]}},
Run Code Online (Sandbox Code Playgroud)
当然,平台的名称和URL可以从这个结构中提取出来(比如bucket.url.buckets.first.key),但是有更干净,更简单的方法来完成任务吗?
zve*_*rok 44
似乎显示意图的最佳方式是热门命中聚合:"从每个聚合组中只选择一个文档",然后从中提取平台:
aggs: {
platforms: {
terms: {field: 'platform.id'},
aggs: {
platform: {top_hits: {size: 1, _source: {include: ['platform']}}}
}
}
Run Code Online (Sandbox Code Playgroud)
这样,每个bucked看起来像:
{"key": 7,
"doc_count": 529939,
"platform": {
"hits": {
"hits": [{
"_source": {
"platform":
{"id": 7, "name": "Facebook", "url": "http://facebook.com"}
}
}]
}
},
}
Run Code Online (Sandbox Code Playgroud)
这有点太深了(和ES一样),但很干净: bucket.platform.hits.hits.first._source.platform
| 归档时间: |
|
| 查看次数: |
11656 次 |
| 最近记录: |