Фреймворк агрегации - это мощный инструмент, встроенный в каждое развертывание Elasticsearch. В Elasticsearch агрегация - это коллекция или сбор связанных вещей вместе. Фреймворк агрегации собирает данные на основе документов, которые соответствуют поисковому запросу, что помогает создавать сводки данных. С помощью агрегаций можно не только искать данные, но и делать шаг вперед, извлекая аналитическую информацию.
Что такое агрегация Elasticsearch?
Агрегации используются в Kibana повсеместно: в инструментальных панелях, приложении APM, приложении Machine Learning и так далее. Агрегации также активно используются в распространенных сценариях поиска, например, на сайте электронной коммерции. В таких случаях результаты поиска обычно сопровождаются набором фильтров, которые учитывают только объем набора результатов поиска. Затем пользователю предоставляется возможность дополнительной фильтрации, например, по категории товара, цвету, диапазону цен и так далее. Эти параметры фильтрации обычно сопровождаются метрическими показателями, чтобы дать пользователю представление, например, о том, сколько товаров в каждой категории содержится в результатах поиска.
Подобные возможности возможны только при использовании фреймворка aggregations.
Другие примеры использования фреймворка агрегации включают следующее:
- Среднее время загрузки веб-сайта
- Наиболее ценные клиенты на основе объема транзакций
- Гистограмма, показывающая некоторую метрику (количество, среднее, сумму, ...) для событий, произошедших в динамически генерируемые периоды времени
- Количество товаров в каждой товарной категории.
Типы агрегаций
- Агрегации по бакетам: Агрегация, при которой документы группируются в бакеты, также называемые корзинами, на основе значений полей, диапазонов или других критериев в документе. При выполнении агрегации документы помещаются в соответствующую корзину (корзины). Таким образом можно разделить набор счетов на несколько ведер, по одному для каждого клиента, системные журналы разделить на "ошибки", "предупреждения" и "информацию", а данные о производительности процессора разделить на почасовые ведра. Выходные данные состоят из списка бакетов, каждый из которых имеет ключ и количество документов. Вот несколько примеров агрегации ведер: Агрегация гистограмм, агрегация диапазонов, агрегация терминов, агрегация фильтров, агрегация географических расстояний и агрегация диапазонов IP.
- Агрегации метрик: Агрегации, которые вычисляют метрики, такие как сумма или среднее, из значений полей. В основном относится к математическим вычислениям, выполняемым по набору документов, обычно на основе значений числовых полей, присутствующих в документе, таких как COUNT, SUM, MIN, MAX, AVERAGE и т. д. Метрики могут выполняться на верхнем уровне, но часто более полезны в качестве суб-агрегации для расчета значений для агрегации ведра.
- Конвейерные агрегации: Агрегации, которые получают входные данные не из документов или полей, а из других агрегаций. Эти агрегации позволяют производить агрегацию на основе результатов другой агрегации, а не на основе наборов документов. Обычно такие агрегации используются для определения среднего количества документов в ведре или для сортировки ведер на основе метрики, полученной с помощью метрической агрегации.
Синтаксис агрегирования
Вы запрашиваете кластер для выполнения агрегаций, добавляя параметр aggregations (или сокращенно aggs) в запрос на поиск. Вы можете запросить более одной агрегации в одном запросе. Можно даже запрашивать подагрегаты агрегации ведра. В следующем примере показан запрос, который запрашивает сумму количеств товаров, сгруппированных по странам.
В приведенном ниже примере, допустим, используется сайт электронной коммерции, который действует как торговая площадка, то есть позволяет сторонним поставщикам рекламировать товары на своем сайте, поэтому в данном примере мы хотим знать, сколько единиц каждого продукта есть в каждой стране, и мы делаем это путем суммирования запасов каждого стороннего поставщика. Это даст нам глобальный запас.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | POST products/_search { "size": 0, "aggs": { "by-country": { "terms": { "field": "country" }, "aggs": { "stock": { "sum": { "field": "qty" } } } } } } |
Обратите внимание на некоторые моменты в приведенном выше примере:
- Агрегаты и агрегированные данные можно использовать как взаимозаменяемые. У каждого агрегата (или подагрегата) есть имя (в данном случае по странам и акциям).
- Мы установили размер результатов равным 0, что означает, что мы не получим ни одного совпадения в ответе. Это совсем не редкость и даже рекомендуется.
- В примере мы использовали только типы агрегации terms (агрегация ведра) и sum (агрегация метрики), но фреймворк агрегации предлагает гораздо больше возможностей.
- Мы использовали подагрегацию. Обратите внимание, что агрегация по странам фактически создает ведра (группы) результатов, а агрегация по запасам дает метрику для каждого ведра. Вы можете вложить столько агрегаций ведер, сколько захотите, прежде чем мы наконец (и по желанию) запустим агрегацию метрик.
Вложенные агрегации
Можно вложить агрегаты друг в друга (это не имеет отношения к вложенным полям), чтобы разделить баки на подбаки или вычислить метрики на основе подбаков. Приведенная ниже агрегация разделит все результаты экзаменов по полу ученика, а затем вычислит средние результаты для каждого пола. В данном случае важно понимать, что вторая агрегация будет рассчитана на отдельном наборе ведер, а не на наборе документов в целом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | POST exam_results*/_search { "size": 0, "aggs": { "genders": { "terms": { "field": "gender" }, "aggs": { "avg_grade": { "avg": { "field": "grades" } } } } } } |
Производительность агрегации
Агрегации обычно выполняются в оперативной памяти и требуют иной структуры доступа к документу, чем поисковый запрос, полученный из инвертированного индекса, поэтому при построении агрегаций важно учитывать влияние производительности. Наиболее важными соображениями являются:
Количество бакетов
Это контролируется параметром "size" в агрегации терминов или "calendar interval" в гистограмме дат. Имейте в виду, что если у вас есть агрегаты бакетов, вложенные более чем на одном уровне, то общее количество бакетов будет умножаться для каждого уровня агрегации.
Количество документов
При выполнении агрегации желательно (если это возможно) настроить запрос таким образом, чтобы агрегация выполнялась только по ограниченному набору интересующих вас документов, а не по запросу match_all. Это позволит сократить объем памяти, необходимой для выполнения агрегации.
Fielddata
Агрегации, как правило, всегда выполняются по полям типа "keyword ", а не по анализируемому тексту. Можно выполнять агрегацию по анализируемому тексту, используя настройку мапинга "fielddata": "true", но это требует много памяти, и по возможности этого следует избегать.