我有一个弹性搜索索引,其中包含以下文档:
{
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中展开数组?出于安全考虑,我想避免使用脚本。
谢谢,
托马斯