Работа со сложными структурами данных - распространенная проблема при работе с Elasticsearch. Одной из таких структур являются вложенные документы, из которых можно эффективно извлекать метрики с помощью вложенных агрегаций Elasticsearch. В этой статье мы подробно рассмотрим концепцию вложенных агрегаций Elasticsearch, примеры их использования и способы эффективной реализации.
Понимание вложенных документов
Прежде чем погрузиться в изучение вложенных агрегатов, необходимо понять, что такое вложенные документы. В Elasticsearch документы могут иметь сложные поля, которые на самом деле содержат набор связанных поддокументов, известных как вложенные документы. Эти вложенные документы хранятся в отдельном индексе, что позволяет эффективно выполнять запросы и лучше оценивать релевантность.
Когда использовать вложенные агрегации в Elasticsearch?
Вложенные агрегации особенно полезны при работе со сложными структурами данных, которые содержат коллекцию связанных с ними поддокументов, например:
- Платформы электронной коммерции: Анализ отзывов о товарах, где каждый товар имеет несколько отзывов, и каждый отзыв имеет несколько атрибутов, таких как рейтинг, автор и дата.
- Платформы социальных сетей: Анализ пользовательского контента, где каждый пользователь имеет несколько постов, и каждый пост имеет несколько атрибутов, таких как лайки, комментарии и акции.
- Анализ журналов: Анализ журналов с несколькими уровнями информации, например журналов сервера, содержащих данные о запросах и ответах, каждый из которых имеет свои атрибуты.
Реализация вложенных агрегаций
Как реализовать вложенные агрегации в Elasticsearch
- Определение вложенного мапинга
- Индексировать документы
- Выполните вложенную агрегацию
Теперь давайте шаг за шагом рассмотрим процесс реализации вложенной агрегации в Elasticsearch.
Шаг 1: Определите вложенный мапинг
Сначала необходимо определить вложенное отображение для поля, содержащего вложенные документы. Например, рассмотрим платформу электронной коммерции с товарами и отзывами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | PUT /products { "mappings": { "properties": { "name": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } }, "reviews": { "type": "nested", "properties": { "rating": { "type": "integer" }, "author": { "type": "text" }, "date": { "type": "date" } } } } } } |
Подполе " keyword" необходимо, потому что мы собираемся создать ведра для каждого продукта и затем вычислить среднюю оценку отзывов для каждого продукта.
Шаг 2: Индексирование документа
Далее проиндексируйте приведенные ниже документы, которые содержат несколько обзоров в виде вложенных друг в друга документов.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | PUT /products/_doc/1 { "name": "Product A", "reviews": [ { "rating": 5, "author": "Alice", "date": "2021-01-01" }, { "rating": 4, "author": "Bob", "date": "2021-01-02" } ] } PUT /products/_doc/2 { "name": "Product B", "reviews": [ { "rating": 1, "author": "John", "date": "2021-01-03" }, { "rating": 2, "author": "Mary", "date": "2021-01-04" }, { "rating": 3, "author": "James", "date": "2021-01-05" }, { "rating": 4, "author": "Elisabeth", "date": "2021-01-06" }, { "rating": 5, "author": "Richard", "date": "2021-01-07" } ] } |
Шаг 3: Выполните вложенное агрегирование
Теперь вы можете выполнить вложенную агрегацию для вложенных документов. Например, давайте вычислим средний рейтинг для каждого продукта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | GET /products/_search { "size": 0, "aggs": { "products": { "terms": { "field": "name.keyword" }, "aggs": { "reviews": { "nested": { "path": "reviews" }, "aggs": { "average_rating": { "avg": { "field": "reviews.rating" } } } } } } } } |
Сначала мы создаем букеты для каждого продукта с помощью агрегации терминов. Затем для каждого продукта мы запускаем вложенную агрегацию, чтобы получить доступ к коллекции вложенных документов. Наконец, мы можем рассчитать метрический агрегат по этим вложенным документам, в случае нашего примера - средний рейтинг.
Вот как должен выглядеть ответ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | { … "aggregations": { "products": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "Product A", "doc_count": 1, "reviews": { "doc_count": 2, "average_rating": { "value": 4.5 } } }, { "key": "Product B", "doc_count": 1, "reviews": { "doc_count": 5, "average_rating": { "value": 3 } } } ] } } } |
Заключение
Вложенная агрегация Elasticsearch - это мощная техника для анализа сложных структур данных, содержащих вложенные документы. Определив вложенное отображение, проиндексировав вложенные документы и выполнив вложенные агрегации, вы сможете эффективно анализировать и извлекать полезные сведения из своих данных. Независимо от того, работаете ли вы с электронной коммерцией, социальными сетями или анализируете журналы, вложенное агрегирование поможет вам обнаружить ценную информацию и улучшить возможности поиска и аналитики.