В предыдущих статьях я писал про агрегацию bucket и метрик. Теперь рассмотрим комбинированные агрегации. Если описывать простыми словами то это суммирование множественных событий ( документов ).

Например сумма байтов за день со всех документов, количество документов за месяц от одного хоста.

Сортировка по bucket

Для демонстрации рассмотрим пример с подсчётом запросов (FIELD1) за день и сортировкой по убыванию.

GET mylogs/_search
{
  "aggs": {
	#тут придумываем сами
    "MYFIELD2": {
      "date_histogram": {
	    #поле с датами
        "field": "@timestamp",
        #каким методо разбивать по дате
        "calendar_interval": "day", 
        #сортировка по daily_number_of_bytes ниже
        "order": {
          "MYFIELD1": "desc"
        }
      }
      , 
      "aggs": {
        #тут придумываем сами
        "MYFIELD1": {
          "sum": {
	        #поле по которому суммировать
            "field": "FIELD1"
          }
        }
      }
    }
  }
}

Использование sub bucket

Для примера рассчитаем количество запросов по методам запроса (FIELD1) за месяца. Т.е мы создаём верхний bucket с названием logs_by_month и подчиненный с названием requests_count. Это и называется sub bucket.

GET mylogs/_search
{
  "aggs": {
    "logs_by_month": {
      "date_histogram": {
        "field": "@timestamp",
        "calendar_interval": "month"
      }
      , 
      "aggs": {
        "requests_count": {
          "terms": {
            "field": "FIELD1.keyword",
            "size": 10
          }
        }
      }
    }
  }
}

В выводе получим что-то подобное aggs

top_hits

Применяя top_hits вы можете выводить некоторое количество документов при подсчёте чего-либо. Ещё одна возможность реализации sub bucket.

GET mylogs/_search
{
  "size": 20, 
  "query": {
    "match": {
      "content": "logstash filters"
    }
  },
  "aggs": {
    "blogs_by_author": {
      "terms": {
        "field": "author.keyword"
        
      }, 
      "aggs": {
        "top_hits": {
          "top_hits": {
            "size": 2
          }
        }
      }
    }
  }
}

В выводе получим отсортированные значения по общему количеству и при этом по 2 документа из каждой группы и их score.