Оглавление курса

Объекты и проектирование документа

Выберем между object, nested, flattened и денормализацией на примере предложений продавцов.

Разделов: 4Elasticsearch 9.4.3Ещё не прочитан

Чему вы научитесь

  • Когда теряется связь
  • Цена nested
  • Денормализация и произвольные ключи

Выберем между object, nested, flattened и денормализацией на примере предложений продавцов.

Механизм работы
  • Товар → offers
  • Область одного offer
  • Связанные условия

Выберем между object, nested, flattened и денормализацией на примере предложений продавцов.

Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.

01 / 04

Когда теряется связь

У товара есть два предложения: продавец A с ценой 100 и продавец B с ценой 50. Обычный object-массив хранит значения полей без гарантии связи между элементами. Условия seller=A и price<60 могут найти товар, хотя нужного предложения нет. Если условия должны выполняться для одного предложения, это требование к модели, а не просто к булевой логике.

Самопроверка
02 / 04

Цена nested

Nested сохраняет объекты как отдельные скрытые документы и требует nested-запросов, агрегаций и сортировки. Обновление части большого корневого документа может переиндексировать весь его nested-блок. Число объектов и частота изменений важны для оценки стоимости. Для независимых часто меняющихся предложений стоит сравнить отдельный индекс предложений с документом товара.

Самопроверка
03 / 04

Денормализация и произвольные ключи

Денормализация переносит часто используемые данные в документ и сокращает необходимость связей во время поиска. Изменение бренда тогда требует обновления многих товаров. Flattened подходит для произвольных ключей с простым поиском по значениям, но не заменяет типизированные числовые поля. Parent-child требует совместного размещения и добавляет стоимость join. Не создавайте новое поле mapping для каждого пользовательского свойства без ограничений.

Предложения моделируются отдельно внутри товара, чтобы сохранять связь продавца и цены.

PUT /course-products-offers
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "offers": {
        "type": "nested",
        "properties": {
          "seller": {
            "type": "keyword"
          },
          "price": {
            "type": "double"
          }
        }
      }
    }
  }
}

Как читать результат

Предложения моделируются отдельно внутри товара, чтобы сохранять связь продавца и цены.

Самопроверка
04 / 04

Разбор на примере каталога

Сравните два варианта каталога предложений. В первом товар содержит все 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.