Выберем между object, nested, flattened и денормализацией на примере предложений продавцов.
- Товар → offers
- Область одного offer
- Связанные условия
Выберем между object, nested, flattened и денормализацией на примере предложений продавцов.
Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.
Когда теряется связь
У товара есть два предложения: продавец A с ценой 100 и продавец B с ценой 50. Обычный object-массив хранит значения полей без гарантии связи между элементами. Условия seller=A и price<60 могут найти товар, хотя нужного предложения нет. Если условия должны выполняться для одного предложения, это требование к модели, а не просто к булевой логике.
СамопроверкаЦена nested
Nested сохраняет объекты как отдельные скрытые документы и требует nested-запросов, агрегаций и сортировки. Обновление части большого корневого документа может переиндексировать весь его nested-блок. Число объектов и частота изменений важны для оценки стоимости. Для независимых часто меняющихся предложений стоит сравнить отдельный индекс предложений с документом товара.
СамопроверкаДенормализация и произвольные ключи
Денормализация переносит часто используемые данные в документ и сокращает необходимость связей во время поиска. Изменение бренда тогда требует обновления многих товаров. Flattened подходит для произвольных ключей с простым поиском по значениям, но не заменяет типизированные числовые поля. Parent-child требует совместного размещения и добавляет стоимость join. Не создавайте новое поле mapping для каждого пользовательского свойства без ограничений.
Предложения моделируются отдельно внутри товара, чтобы сохранять связь продавца и цены.
{
"mappings": {
"properties": {
"name": {
"type": "text"
},
"offers": {
"type": "nested",
"properties": {
"seller": {
"type": "keyword"
},
"price": {
"type": "double"
}
}
}
}
}
}Как читать результат
Предложения моделируются отдельно внутри товара, чтобы сохранять связь продавца и цены.
Разбор на примере каталога
Сравните два варианта каталога предложений. В первом товар содержит все offers и обновляется целиком при изменении остатка одного продавца. Во втором каждое предложение — отдельный документ, а результаты группируются по товару. Первый удобен для связных условий и возврата полной карточки, второй уменьшает размер единицы обновления, но усложняет группировку и счётчики. Нельзя выбрать между ними только по числу полей: нужны частота изменений, размер массива, требования выдачи и допустимая стоимость пересборки документа.
СамопроверкаСамопроверка
Сначала ответьте самостоятельно, затем раскройте объяснение.
1. Почему seller=A AND price<60 может ошибаться?
При object значения могут относиться к разным элементам массива.
2. Когда нужен nested?
Когда несколько условий должны относиться к одному объекту массива.
3. Бесплатен ли nested update?
Нет, переиндексация блока может быть дорогой.
4. Чем опасны произвольные ключи?
Они могут вызвать mapping explosion и рост метаданных.
5. Зачем денормализация?
Чтобы подготовить данные под чтение, приняв стоимость распространения обновлений.
Ситуационный разбор модуля: Модель данных и анализ текста
В каталоге два продавца предлагают один товар по разным ценам. Требуются поиск по русским названиям, точный бренд и фильтр цены конкретного продавца. Предложите mapping и объясните, почему одного text-поля и массива object недостаточно.
Критерии самопроверки
Есть text и keyword, языковой анализ проверен через _analyze, связь продавца и цены сохраняется через nested либо отдельные документы.
Краткая памятка
- При object значения могут относиться к разным элементам массива.
- Когда несколько условий должны относиться к одному объекту массива.
- Нет, переиндексация блока может быть дорогой.
- Они могут вызвать mapping explosion и рост метаданных.
- Чтобы подготовить данные под чтение, приняв стоимость распространения обновлений.
Официальная документация
Готовы применить знания?
Подтвердите прочтение, чтобы сохранить своё место. Чтение и решение заданий учитываются отдельно в этом браузере с помощью гостевой cookie.