使用Elasticsearch日期直方图聚合来计算数组属性中的日期

时间:2016-04-06 14:59:13

标签: elasticsearch date-histogram

我有一个弹性搜索索引,其中包含以下文档:

{
  dates: ["2014-01-31","2014-02-01"]
}

我想计算我的索引中按年和月分隔的所有日期的所有实例。我希望使用日期直方图聚合(成功计算非数组属性)来做到这一点:

{
  "from": 0,
  "size": 0,
  "aggregations": {
    "year": {
      "date_histogram": {
        "field": "dates",
        "interval": "1y",
        "format": "yyyy"
      },
      "aggregations": {
        "month": {
          "date_histogram": {
            "field": "dates",
            "interval": "1M",
            "format": "M"
          },
          "aggregations": {
            "day": {
              "date_histogram": {
                "field": "dates",
                "interval": "1d",
                "format": "d"
              }
            }
          }
        }
      }
    }
  }
}

但是,我得到以下聚合结果:

"aggregations": {
  "year": {
     "buckets": [
        {
           "key_as_string": "2014",
           "key": 1388534400000,
           "doc_count": 1,
           "month": {
              "buckets": [
                 {
                    "key_as_string": "1",
                    "key": 1388534400000,
                    "doc_count": 1,
                    "day": {
                       "buckets": [
                          {
                             "key_as_string": "31",
                             "key": 1391126400000,
                             "doc_count": 1
                          },
                          {
                             "key_as_string": "1",
                             "key": 1391212800000,
                             "doc_count": 1
                          }
                       ]
                    }
                 },
                 {
                    "key_as_string": "2",
                    "key": 1391212800000,
                    "doc_count": 1,
                    "day": {
                       "buckets": [
                          {
                             "key_as_string": "31",
                             "key": 1391126400000,
                             "doc_count": 1
                          },
                          {
                             "key_as_string": "1",
                             "key": 1391212800000,
                             "doc_count": 1
                          }
                       ]
                    }
                 }
              ]
           }
        }
     ]
  }
}

“day”聚合忽略其父“月”聚合的存储桶,因此它处理每个存储桶中数组的两个元素,每个日期计算两次。结果表明每个月出现两个日期(总共四个),这显然是不正确的。

我已经尝试将我的聚合减少到单个日期直方图(并根据键将结果存储在java中)但是doc_count返回为1而不是数组中的元素数(在我的示例中为两个)。添加value_count会让我回到原来的问题,即重叠多个存储桶的文档会将其日期重复计算。

有没有办法在日期直方图聚合中添加过滤器或以其他方式修改它们,以便正确计算我的日期数组中的元素?或者,Elasticsearch是否可以选择在MongoDB中展开数组?出于安全考虑,我想避免使用脚本。

谢谢,

托马斯

0 个答案:

没有答案