如何计算弹性搜索中每Y的平均X?

时间:2015-11-10 04:35:30

标签: elasticsearch

假设我有一个事件列表,例如'pageview'。我想计算每个会话的平均综合浏览量。

我的文档看起来像这样

{
  sessionID: 'xxx',
  action: 'pageview'
}

所以我试图做的是首先通过sessionID聚合然后应用avg。儿童聚合,但这不是我的预期。

我对ElasticSeach很新。在EC中生成这种聚合的逻辑是什么?

由于

1 个答案:

答案 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值。