ElasticSearch中的并发事件聚合

Pet*_*bel 5 elasticsearch

我有许多文档,分别代表starts_at和的事件ends_at。在指定的时间点,如果所讨论的事件在starts_at之前和之后,则该事件被视为活动事件ends_at

我正在寻找一个聚合,这应该导致一个日期直方图,其中每个存储桶都包含该间隔中的活动事件数。

到目前为止,我发现的最好的近似值是创建一组计算每个间隔中起始数目的存储桶,以及一组对应的计数终止数目的存储桶,然后通过从中减去起始数目来对其进行后处理每个间隔的结束数:

{
  "size": "0",
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "and": [
          {
            "term": {
              "_type": "event"
            }
          },
          {
            "range": {
              "starts_at": {
                "gte": "2015-06-14T05:25:03Z",
                "lte": "2015-06-21T05:25:03Z"
              }
            }
          }
        ]
      }
    }
  },
  "aggs": {
    "starts": {
      "date_histogram": {
        "field": "starts_at",
        "interval": "15m",
        "extended_bounds": {
          "max": "2015-06-21T05:25:04Z",
          "min": "2015-06-14T05:25:04Z"
        },
        "min_doc_count": 0
      }
    },
    "ends": {
      "date_histogram": {
        "field": "ends_at",
        "interval": "15m",
        "extended_bounds": {
          "max": "2015-06-21T05:25:04Z",
          "min": "2015-06-14T05:25:04Z"
        },
        "min_doc_count": 0
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找类似的解决方案

有没有一种方法可以通过单个查询来实现?

Nik*_*yrh 0

我不是 100% 确定,但即将推出的管道聚合可能会在不久的将来以更优雅的方式解决这个问题。

同时,您可以选择所需的时间分辨率,并且在索引时间除了字段之外,starts_atends_at还可以生成active_at字段。它将是一个时间戳数组,您可以使用任一术语(如果它映射为 not_analyzed 字符串)或 date_histogram 聚合来获取每个时间段的正确“活动事件计数”。

缺点是存储需求膨胀,并且性能可能更差,因为有更多的字段值需要聚合。不管怎样,如果你不选择像 1 分钟这样太高的时间分辨率,应该不会太糟糕。