Использование 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? Я хочу избежать использования сценариев из-за проблем безопасности.

Спасибо,

Томас

0 ответов

Другие вопросы по тегам