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

Mapping и типы полей

Спроектируем явную схему каталога и разберём последствия выбора типов.

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

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

  • Явная схема вместо догадок
  • Строки, числа и даты
  • Отсутствие и эволюция

Спроектируем явную схему каталога и разберём последствия выбора типов.

Механизм работы
  • Контракт входа
  • Типы и представления
  • Возможности запросов

Спроектируем явную схему каталога и разберём последствия выбора типов.

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

01 / 05

Явная схема вместо догадок

Dynamic mapping выводит тип из первых встреченных значений. Это удобно при исследовании, но опасно для денежных значений, идентификаторов и дат: первая строка может задать неподходящее представление. Explicit mapping фиксирует контракт. dynamic=strict отклоняет неизвестные поля, dynamic=false оставляет их в _source без обычной динамической индексации. Выбор зависит от управляемости поставщиков данных.

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

Строки, числа и даты

Название товара — text, бренд и артикул — keyword. Цена может храниться в целых минимальных денежных единицах либо scaled_float с заданным коэффициентом; выбор округления должен совпадать с бизнес-правилами. Даты имеют формат и часовой пояс при разборе. Числовой вид артикула не делает его числом: ведущие нули и точная идентичность важнее арифметики.

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

Отсутствие и эволюция

Отдельного типа массива нет: поле может содержать несколько совместимых значений. null и пустой массив обычно не создают индексируемого значения; пустая строка может его создавать. exists проверяет индексированное присутствие, а не просто ключ JSON. index=false, doc_values и enabled меняют возможности поля по-разному. Смена существующего типа обычно требует нового индекса и reindex; coerce не заменяет валидацию входных данных.

Создание учебного индекса: типы задаются до загрузки данных.

PUT /course-products
{
  "mappings": {
    "dynamic": "strict",
    "properties": {
      "name": {
        "type": "text"
      },
      "sku": {
        "type": "keyword"
      },
      "price": {
        "type": "scaled_float",
        "scaling_factor": 100
      },
      "description": {
        "type": "text"
      },
      "brand": {
        "type": "keyword"
      },
      "rating": {
        "type": "float"
      },
      "in_stock": {
        "type": "boolean"
      },
      "product_id": {
        "type": "keyword"
      }
    }
  }
}

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

Создание учебного индекса: типы задаются до загрузки данных.

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

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

Представьте цену 19.995 при требовании двух десятичных знаков. Сначала нужно определить бизнес-округление, а не надеяться, что floating-point тип автоматически решит денежную задачу. Артикул "00042" сохраняют строкой даже при отсутствии букв. Поле rating допускает отсутствие, но price может быть обязательным на границе загрузки. dynamic=strict не проверяет все бизнес-инварианты: документ с известными полями, но без цены, всё ещё требует отдельной проверки. Mapping задаёт способ хранения и поиска, а не полноценную бизнес-валидацию.

Неизвестное поле при dynamic=strict

PUT /course-products/_doc/rejected
{
  "unknown_field": "unexpected"
}
Ответ Elasticsearch
Сокращённый ответ · JSON
{
  "error": {
    "type": "strict_dynamic_mapping_exception"
  },
  "status": 400
}

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

После создания strict mapping неизвестное поле отклоняется. Это сокращённый фрагмент ошибки, документ не записан.

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

Подготовка учебного набора

Запросы к course-products в новых главах используют эту схему. После её создания запишите документ ниже. Это отдельный набор, не публичные 300 товаров тренажёра: у него brand имеет тип keyword, тогда как в упражнениях используется brand.keyword. Административные операции выполняются в собственном учебном окружении, а тренажёр остаётся доступным только для поиска. Значения и идентификаторы учебных примеров не являются ответами к упражнениям.

Первый товар учебного каталога

PUT /course-products/_doc/sku-1?refresh=wait_for
{
  "name": "Running headphones",
  "description": "Wireless headphones for running",
  "sku": "sku-1",
  "brand": "Sony",
  "price": 99,
  "rating": 4,
  "in_stock": true,
  "product_id": "sku-1"
}

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

Для первого создания result=created, для повторной записи того же _id — updated. Добавляйте товары для проверки границ и альтернатив.

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

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

Сначала ответьте самостоятельно, затем раскройте объяснение.

1. Как хранить артикул 0012?

Как keyword, если важна идентичность и ведущие нули.

2. Что делает dynamic=strict?

Отклоняет документ с неизвестными полями в соответствующей области mapping.

3. Равны ли null и пустая строка?

Нет: пустая строка может быть индексируемым значением.

4. Можно ли заменить keyword на text на месте?

Для существующего типа обычно нужен новый индекс и переиндексация.

5. Как выбрать тип цены?

Определить точность, диапазон и округление; затем выбрать целые минимальные единицы или scaled_float.

Краткая памятка

  • Как keyword, если важна идентичность и ведущие нули.
  • Отклоняет документ с неизвестными полями в соответствующей области mapping.
  • Нет: пустая строка может быть индексируемым значением.
  • Для существующего типа обычно нужен новый индекс и переиндексация.
  • Определить точность, диапазон и округление; затем выбрать целые минимальные единицы или scaled_float.

Официальная документация

Готовы применить знания?

Подтвердите прочтение, чтобы сохранить своё место. Чтение и решение заданий учитываются отдельно в этом браузере с помощью гостевой cookie.