Elasticsearch:根据日期范围汇总文档

时间:2017-08-02 09:18:31

标签: elasticsearch elasticsearch-5 elasticsearch-aggregation date-histogram

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

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

示例文档内容:

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

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

2 个答案:

答案 0 :(得分:1)

我找到了一种方法,使用过滤器聚合( 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个桶式过滤器,这会使得查询结果非常大。

答案 1 :(得分:-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