Использование Elasticsearch Гистограмма даты агрегации для подсчета дат в свойствах массива
У меня есть эластичный индекс поиска со следующим документом:
{
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? Я хочу избежать использования сценариев из-за проблем безопасности.
Спасибо,
Томас