我有一个带有以下文档的弹性搜索索引:
{
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
}
]
}
}
]
}
}
]
}
}
“日”聚合忽略其父“月”聚合的存储桶,因此它处理每个存储桶中数组的两个元素,对每个日期计数两次。结果表明每个月出现两个日期(总共四个),这显然是不正确的。
我尝试将聚合减少到单个日期直方图(并根据键将结果存储在 java 中),但 doc_count 返回一个而不是数组中的元素数(在我的示例中为两个)。添加 value_count 让我回到原来的问题,即重叠多个存储桶的文档的日期被重复计算。
有没有办法将过滤器添加到日期直方图聚合或以其他方式修改它们以正确计算我的日期数组中的元素?或者,Elasticsearch 是否可以像在 MongoDB 中那样展开数组?出于安全考虑,我想避免使用脚本。
谢谢,
托马斯