Посмотри на экран поиска любого интернет-магазина. Слева список фильтров, и рядом с каждым число: «Итальянская (225)», «Японская (200)», «до 400 ₽ (312)». Эти числа считаются по тем же найденным товарам, что справа в списке, и меняются вместе с запросом. Их называют фасетами, и в Elasticsearch их считают агрегациями.
Агрегации
Агрегация это сводка по найденным документам. Её пишут в том же запросе _search, что и поиск, в разделе aggs. Elasticsearch сначала находит документы по query, а потом считает по ним сводку. Это похоже на GROUP BY в SQL, только сразу поверх поиска.
Агрегации бывают двух видов.
Корзины делят документы на группы:
terms: по значениям поляkeyword. Кухни, теги, рестораны;range: по диапазонам чисел. «До 400», «400-600», «от 600»;histogramиdate_histogram: по ровным интервалам числа или времени. Заказы по дням, об этом в части про логи.
Метрики считают число по документам:
avg,sum,min,max,stats(всё сразу);cardinality: сколько разных значений, например сколько ресторанов;percentiles: перцентили, например 95-й перцентиль времени ответа.
Корзины можно вкладывать: внутри каждой кухни посчитать среднюю цену. Получится вложенная агрегация.
Одна тонкость terms
У terms есть size: сколько корзин вернуть, по умолчанию 10, самые крупные первыми. Остальные документы не теряются: их число в поле sum_other_doc_count. А doc_count_error_upper_bound показывает, насколько счёт может ошибаться, когда индекс разбит на много шардов: каждый шард присылает свой топ, и редкое значение могло не войти в топ какого-то шарда. На одном шарде ошибки нет.
урок из курса
Урок из курса «Elasticsearch и ELK». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.