假设我有一个事件列表,例如'pageview'。我想计算每个会话的平均综合浏览量。
我的文档看起来像这样
{
sessionID: 'xxx',
action: 'pageview'
}
所以我试图做的是首先通过sessionID聚合然后应用avg。儿童聚合,但这不是我的预期。
我对ElasticSeach很新。在EC中生成这种聚合的逻辑是什么?
由于
答案 0 :(得分:1)
您已通过汇总sessionID
字段正确开始了。然后,您需要filter
字段上的另一个action
子聚合,以仅匹配pageview
个操作。您的聚合查询如下所示:
{
"size": 0,
"aggs": {
"sessions": {
"terms": {
"field": "sessionID"
},
"aggs": {
"pageviews": {
"filter": {
"term": {
"action": "pageview"
}
}
}
}
}
}
}
这将为您提供每个会话的总doc_count
,并且在每个会话中,您将获得该会话中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,您可以让ES使用pipeline aggregations为您计算平均值。
{
"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
行动的数量与该会话的总操作数量相比,您将获得pageview
值。