Что если вы хотите применить агрегацию метрик при этом рассчитывая их отдельно для какой-то группы данных? Напримеры вы хотите узнать количество уникальных пользователей за каждый месяц. Такая агрегация в elasticsearch называется агрегация bucket (Bucket Aggregations).

Для каждой даты будет создаваться bucket. Будьте внимательны при выборе интервала даты. Чем меньше интервал, тем больше bucket. Создание слишком большого количества bucket может повредить кластер. Максимальное количество bucket, которое можно создать, по умолчанию - 10 000.

Количество создаваемых bucket можно указать с помощью size ( по умолчанию 10 ).

Date Histogram

Агрегация date_histogram помещает документы в сегменты на основе заданного временного интервала. Он может дать хороший обзор распределения ваших данных по времени. Ответ агрегирования содержит массив bucket. Каждый bucket в этом массиве представляет собой набор документов из одного диапазона заданного временного интервала. Каждый сегмент также содержит метрику по умолчанию для документов в этом сегменте, которая представляет собой количество документов во временном диапазоне этого сегмента (doc_count).

Есть два способа определить интервал:

  • Fixed_interval: этот параметр имеет предустановленные значения интервала, длина интервала которых всегда постоянна.
  • Calendar_interval: интервалы в этом параметре знают, что летнее время изменяет продолжительность определенных дней и что в некоторых месяцах другое количество дней.
GET INDEX/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "date_histogram": {
        "field": "DATEFIELD1",
        "calendar_interval": "day"
      }
    }
  }
}

Histogram Aggregation

Работает так же как и date_histogram за исключением того, что его можно применить к любому числовому полю (а не только к дате).

Например можно использовать если вы хотите получить обзор распределения времени ответа ваших журналов, вы можете использовать следующее агрегирование.

GET INDEX/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "histogram": {
        "field": "runtime_ms",
        "interval": "100"
      }
    }
  }
}

Range Aggregation

Смотря на пример выше вы наверняка могли подумать а что если я хочу сам задать интервал от и до. В таком случае подойдёт ranges.

GET INDEX/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "range": {
        "field": "runtime_ms",
        "ranges": [
          {
            "from": 100,
            "to": 200
          },
           {
            "from": 400,
            "to": 500
          }
        ]
      }
    }
  }
}

Terms Aggregation

С помощью terms можно расчитать количество документов сортируя по уникальным значениям. Например можно расчитать количество запросов по странам.

GET INDEX/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "terms": {
        "field": "COUNTRYFIELD1.keyword",
        "size": 10
      }
    }
  }
}

Сортировка Bucket

Для сортировки bucket можно восспользоваться order.

GET INDEX/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "terms": {
        "field": "COUNTRYFIELD1.keyword",
        "size": 10, 
        "order": {
          "_key": "asc"
        }
      }
    }
  }
}

Но стоит помнить что при использовании size вы не увидите самые большие значения из всех документов. Чтобы отсортировать именно по значению:

GET INDEX/_search
{
  "size": 0,
  "aggs": {
    "my_agg": {
      "terms": {
        "field": "COUNTRYFIELD1.keyword",
        "size": 10, 
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}