3

我在 ElasticSearch 5.5 中有一组文档,其中包含两个日期字段:start_date 和 end_date。我想将它们聚合到日期直方图存储桶中(例如:每周),这样如果 start_date < week X < end_date,那么文档将位于“week X”存储桶中。这意味着单个文档可能位于多个存储桶中。

考虑以下具体示例:我有一组描述公司员工的文档,并且对于每个员工,您都有雇用日期和(可选)终止日期。我想建立过去十二个月的活跃员工人数的日期直方图。

示例文档内容:

{
   "start_date": "2013-01-12T00:00:00.000Z",
   "end_date": "2016-12-08T00:00:00.000Z",
   "id": "123123123"
}

有没有办法在 ES 中做到这一点?

4

2 回答 2

3

我找到了一种方法,使用过滤器聚合( https://www.elastic.co/guide/en/elasticsearch/reference/master/search-aggregations-bucket-filter-aggregation.html)。例如,如果我需要 12 个尾随月份的报告,那么我将创建 12 个存储桶,其中每个存储桶定义过滤条件,例如:

"bool":{
 "must":[{
  "range":{
   "start_date":{
    "lte":"2016-01-01T00:00:00.000Z"
   }
  }
 },{
 {
  "range":{
   "end_date":{
    "gt":"2016-02-01T00:00:00.000Z"
   }
  }
 }]
}

但是,我觉得如果有更简单的方法来做到这一点会很好,因为如果我想说跟踪 365 天,这意味着我必须创建 365 个桶过滤器,这会使结果查询非常大。

于 2017-08-03T10:29:25.793 回答
-1

我知道这个问题已经很老了,但由于它仍然开放,我正在分享我的知识。这个问题也没有清楚地解释预期什么样的输出,但我仍然认为这可以使用“日期直方图聚合”和“桶脚本聚合”来实现。

以下是这两个聚合的文档链接。

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-aggregations-bucket-datehistogram-aggregation.html

https://www.elastic.co/guide/en/elasticsearch/reference/5.5/search-aggregations-pipeline-bucket-script-aggregation.html

于 2019-06-11T11:08:13.020 回答