我知道elasticsearch允许sub-aggregations(即嵌套聚合),但是我想对“第一”聚合的结果应用聚合(或者在通用的任何查询 - 聚合或不聚合)。
具体示例:我记录有关用户操作的事件(为简单起见,我的文档包含user_id
和action
)。我可以创建一个查询,计算每个用户执行的操作数。但是,我想找出“活跃用户”的百分比(或计数)(例如,执行了超过10个操作的用户)。理想的结果是histogram超过所有用户,显示用户的活跃程度。
有没有办法创建这样的查询?或者除了存储子查询的聚合结果并计算直方图之外,我还能采取其他方法吗?
注意:我已经看到了Elastic Search and "sub queries"的问题,但它是关于其他事情的,并且它已经超过一年半了,而且正在积极开发弹性搜索。
此外,似乎在版本1.4中将有可用的脚本度量聚合,但无论如何需要为每个用户存储计数器,直到减少阶段。一些“近似解决方案”对我有好处 - 类似于ES使用internally for its aggregations。
答案 0 :(得分:2)
这是我使用的查询,请注意" 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。