我知道elasticsearch允许
sub-aggregations(即嵌套聚合),但是我想对“第一”聚合的结果应用聚合(或者在通用的任何查询 – 聚合或不聚合).
具体示例:我记录有关用户操作的事件(为简单起见,我有使用user_id和action的文档).我可以创建一个查询,计算每个用户执行的操作数.但是,我想找出“活跃用户”的百分比(或计数)(例如,执行了超过10个操作的用户).理想的结果将是所有用户显示用户活跃程度的histogram.
有没有办法如何创建这样的查询?或者除了存储子查询的聚合结果并计算直方图外,还有其他方法吗?
注意:我已经看到了Elastic Search and “sub queries”问题,但它是关于其他的东西,它已经超过一年半了,而且弹性搜索正在积极开发中.
此外,似乎在版本1.4中将有可用的脚本度量聚合,但无论如何需要为每个用户存储计数器,直到减少阶段.一些“近似解决方案”对我有好处 – 类似于ES使用internally for its aggregations.
最佳答案 这是我使用过的查询,注意聚合中的“min_doc_count”.
{
"query": {
"filtered": {
"filter": {
"and": [
{ "term" : { "name": "did x" } },
{ "range": { "created_at": { "gte": "now-7d", "lte": "now" } } }
]
}
}
},
"aggregations": {
"my_agg": {
"terms": {
"field": "user_id",
"min_doc_count": 10,
"size": 0
}
}
}
}
此查询返回指定时间段内包含9个以上事件的存储桶(用户)列表.只需’计数’即可获得活跃用户数.
我已经用成千上万的事件测试了这种方法并且运行良好.在某种程度上,您将不得不使用Hadoop.