假设我有一个事件列表,例如“网页浏览”。我想计算每个 session 的平均综合浏览量。
我的文件看起来像这样
{
sessionID: 'xxx',
action: 'pageview'
}
因此,我尝试执行的操作是先按sessionID进行汇总,然后再应用avg。子聚合,但这不是我期望的。
我是ElasticSeach的新手。在EC中产生这种聚合的逻辑是什么?
谢谢
最佳答案
通过在sessionID
字段上进行汇总,您已经正确开始了。然后,您需要在filter
字段上再添加一个action
子聚合,以仅匹配pageview
操作。您的聚合查询如下所示:
{
"size": 0,
"aggs": {
"sessions": {
"terms": {
"field": "sessionID"
},
"aggs": {
"pageviews": {
"filter": {
"term": {
"action": "pageview"
}
}
}
}
}
}
}
这将为您提供每个 session 的总
doc_count
,在每个 session 存储区中,您将获得该 session 内doc_count
操作的总pageview
。然后可以轻松地计算平均值
response.aggregations.sessions.forEach(function(session) {
var actionsInSession = session.doc_count;
var pageviewActions = session.pageviews.doc_count;
var avg = pageviewActions / actionsInSession;
// do something with the average value
});
更新
如果您正在使用(或愿意使用)ES 2.0,则可以使用pipeline aggregations让ES为您计算这些平均值。
{
"size": 0,
"aggs": {
"sessions": {
"terms": {
"field": "sessionID"
},
"aggs": {
"total": {
"value_count": {
"field": "sessionID"
}
},
"pageviews": {
"filter": {
"term": {
"action": "pageview"
}
},
"aggs": {
"cnt": {
"value_count": {
"field": "action"
}
}
}
},
"avg": {
"bucket_script": {
"buckets_path": {
"total": "total",
"pageviews": "pageviews > cnt"
},
"script": "pageviews / total"
}
}
}
}
}
}
在每个
sessionID
存储桶中,您将获得avg
操作数与该 session 的总操作数的pageview
值。
关于elasticsearch - 如何在 Elasticsearch 中计算每Y平均X?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33622943/