Elasticsearch在多个字段上的日期范围聚合

时间:2014-11-02 10:31:45

标签: date elasticsearch

我的文件'结构看起来像这样:

{
    "element": "A",
    "date": "2014-01-01",
    "valid_until": "2014-02-01"
},
{
    "element": "A",
    "date": "2014-02-01",
    "valid_until": "9999-12-31"
}

日期" 9999-12-31"在这里说:"它还没有过期"。总是存在这样的范围,因此对于给定的元素" A",date> valid_until永远不会重叠。因此,我可以通过使用这样的伪代码来计算我有多少元素:COUNT个元素WHERE date< date_to_count AND valid_until> = date_to_count

where" date_to_count"是我想要计算值的日期。由于我想在几个时间点计算这个,我可以使用日期直方图或日期范围聚合。但是,日期范围似乎只适用于某种字段。理想情况下,我希望能够做到这一点:

"aggs": {
   "foo": {
       "date_range": {
          "fields": ["date", "valid_until"],
          "ranges": [
              {"from": "2014-01-01", "to": {"2014-02-01"}},
              {"from": "2014-02-01", "to": {"2014-03-01"}},
              {"from": "2014-03-01", "to": {"2014-04-01"}}
          ]
       }
   }
}

" date"将用于"来自"和" valid_until"将被用于"到"。

我已经尝试了其他一些有关脚本的想法,但无法通过这种方式找到一种有效的方法:/。

我想我也可以解决这个问题,如果在一个脚本中,我可以访问当前的from / to值,但是我再一次尝试了像" ctx.to" ," context.to",但这些变量未定义。

谢谢!

2 个答案:

答案 0 :(得分:0)

由于date_rangedate_histogram聚合都适用于单个字段,因此我认为您无法通过聚合实现目标。但是,如果您没有太多需要查询的日期范围,则可以通过查询每个日期范围来调用count API。这看起来像这样:

"query": {
  "filtered": {
    "filter": {
      "bool" {
        "must": [
          { "range": { "date": { "gte": "2014-01-01" }}},
          { "range": { "valid_until": { "lt": "2014-02-01" }}}
        ]
      }
    }
  }
}

答案 1 :(得分:0)

我遇到了同样的问题,并希望通过使用一个查询来解决这个问题。以下是适用于Elasticsearch 5.2的解决方案

"aggs": {
   "range1": {
       "date_range": {
          "fields": "date",
          "ranges": [
              {"from": "2014-01-01", "to": {"2014-02-01"}},
              {"from": "2014-02-01", "to": {"2014-03-01"}},
              {"from": "2014-03-01", "to": {"2014-04-01"}}
          ]
       },
   "range2": {
       "date_range": {
          "field": "valid_until",
          "ranges": [
              {"from": "2014-01-01", "to": {"2014-02-01"}},
              {"from": "2014-02-01", "to": {"2014-03-01"}},
              {"from": "2014-03-01", "to": {"2014-04-01"}}
          ]
       }
   }
}