弹性搜索中的Groupby查询

时间:2018-05-23 10:07:26

标签: elasticsearch group-by

我有一个弹性搜索群集,其中包含我网站的分析数据。用户访问页面时有页面查看事件。每个网页浏览事件都有一个session-id字段,在用户会话期间保持不变。

我想通过按会话ID对事件进行分组并计算第一个事件和最后一个事件之间的持续时间来计算每个会话的会话持续时间

有什么方法可以通过弹性搜索查询来实现这个目标吗?

网页浏览活动

  [
    { 
      "session-id":"234234-234234-324324-23432432",
      "url": 'testpage1',
      "timestamp":54323424222
    },
    { 
      "session-id":"234234-234234-324324-23432432",
      "url": 'testpage2',
      "timestamp":54323424223
    },
    { 
      "session-id":"234234-234234-324324-23432432",
      "url": 'testpage3',
      "timestamp":54323424224
    }
]

会话持续时间为(54323424224 - 54323424222)ms

编辑:

我能够使用sessionid,max timestamp,min stamp,查询min(timestamp)&创建一个数据表可视化。每个会话ID的max(timestamp)。现在我需要的是这些与aggs之间的不同。

2 个答案:

答案 0 :(得分:1)

无法计算存储桶内的最大值和最小值之间的差异。

尝试计算客户端与min-max的差异:

{
  "aggs": {
    "bySession": {
      "terms": {
        "field": "session-id.keyword"
      },
      "aggs": {
        "statsBySession": {
          "stats": {
            "field": "timestamp"
          }
        }
      }
    }
  }
}

答案 1 :(得分:1)

统计信息桶聚合将为您提供有关每个会话的minmax个时间戳的信息。您可以使用存储桶脚本聚合来计算它们(max - min)之间的差异。

参考:bucket-script-aggregation    和stats-bucket-aggregation

您可以使用以下查询来计算每个会话的maxmin时间戳之间的差异ID:

{
  "size": 0,
  "aggs": {
    "session": {
      "terms": {
        "field": "session-id.keyword",
        "size": 10
      },
      "aggs": {
        "stats_bucket":{
          "stats":{
            "field": "timestamp"  
          }
        },
        "time_spent": {
          "bucket_script": {
            "buckets_path": {
              "min_stats": "stats_bucket.min",
              "max_stats": "stats_bucket.max"
            },
            "script": "params.max_stats - params.min_stats"
          }
        }
      }
    }
  }
}