Использование гистограммы даты в Elasticsearch для подсчета последовательной активности

Я индексирую данные журнала доступа Tomcat в Elasticsearch (1.7.3). Документы, с которыми я имею дело, имеют концепцию продолжительности, представленную как время окончания и продолжительность в миллисекундах (время начала можно рассчитать, хотя я могу также сохранить его, если это поможет решить мою проблему). Например:

{
  ztime: "10-17-2015T04:05:00.000+02:00",
  duration: 4500,
  thred: "http-nio-8080-exec-14"
},
{
  ztime: "10-17-2015T04:07:42.227+02:00",
  duration: 3100,
  thred: "http-nio-8080-exec-25"
}

Моя цель - создать гистограмму, где я показываю каждую секунду, сколько потоков существует.

Я подумал об использовании date_histogram, который объединит мои документы в 1-секундные сегменты.

GET /mindex/mtype/_search?search_type=count
{
  "aggs": {
      "threads_per_hr": {
        "date_histogram": {
          "field": "ztime",
          "interval": "1s",
          "min_doc_count": 1
        },
       "aggs": {
          "per_hr_threads": {
             "cardinality": {
                "field": "thread"
             }
          }
       }
      }
  }
}

тем не менее, таким образом, каждая нить будет упакована только один раз.

Мне нужно, чтобы каждый документ был разбит на несколько ведер. Например, мне нужно, чтобы первый документ был упакован в ведра 04:05:00.000, 04:05:01.000, 04:05:02.000, 04:05:03.000.

Какой тип запроса (Java API и / или REST API) поможет мне достичь этой цели?

1 ответ

Вы должны использовать агрегирование кардинальности здесь. Это дает количество уникальных значений для поля.

GET /{index}/{type}/_search?search_type=count
{
  "aggs": {
      "threads_per_hr": {
        "date_histogram": {
          "field": "ztime",
          "interval": "1s",
          "min_doc_count": 0
        },
       "aggs": {
          "per_hr_threads": {
             "cardinality": {
                "field": "thread"
             }
          }
       }
      }
  }
}
Другие вопросы по тегам