【问题标题】:Elasticsearch date range aggregation over multiple fields跨多个字段的 Elasticsearch 日期范围聚合
【发布时间】:2014-12-29 04:05:11
【问题描述】:

我的文档结构如下:

{
    "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 elements WHERE date = date_to_count

其中“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"}}
          ]
       }
   }
}

“日期”将用于“来自”,“valid_until”将用于“到”。

我用脚本尝试了其他几个想法,但找不到有效的方法:/。

如果在脚本中我可以访问当前的 from/to 值,我想我也可以解决这个问题,但是我再次尝试了诸如“ctx.to”、“context.to”之类的东西,但这些变量是未定义的。

谢谢!

【问题讨论】:

    标签: date elasticsearch


    【解决方案1】:

    我遇到了同样的问题,想通过一个查询来解决这个问题。这是在 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"}}
              ]
           }
       }
    }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-12
        • 2018-01-09
        • 2014-06-04
        • 2015-10-24
        • 2015-12-20
        • 1970-01-01
        相关资源
        最近更新 更多