Спроектируем явную схему каталога и разберём последствия выбора типов.
- Контракт входа
- Типы и представления
- Возможности запросов
Спроектируем явную схему каталога и разберём последствия выбора типов.
Курс ориентирован на Elasticsearch 9.4.3. Разборы упражнений используют публичный набор products; остальные запросы показывают отдельные учебные индексы и могут требовать подготовки или прав, недоступных в тренажёре. Ответы сокращены, score может меняться. Для расширенных функций проверяйте лицензию и вариант развёртывания.
Явная схема вместо догадок
Dynamic mapping выводит тип из первых встреченных значений. Это удобно при исследовании, но опасно для денежных значений, идентификаторов и дат: первая строка может задать неподходящее представление. Explicit mapping фиксирует контракт. dynamic=strict отклоняет неизвестные поля, dynamic=false оставляет их в _source без обычной динамической индексации. Выбор зависит от управляемости поставщиков данных.
СамопроверкаСтроки, числа и даты
Название товара — text, бренд и артикул — keyword. Цена может храниться в целых минимальных денежных единицах либо scaled_float с заданным коэффициентом; выбор округления должен совпадать с бизнес-правилами. Даты имеют формат и часовой пояс при разборе. Числовой вид артикула не делает его числом: ведущие нули и точная идентичность важнее арифметики.
СамопроверкаОтсутствие и эволюция
Отдельного типа массива нет: поле может содержать несколько совместимых значений. null и пустой массив обычно не создают индексируемого значения; пустая строка может его создавать. exists проверяет индексированное присутствие, а не просто ключ JSON. index=false, doc_values и enabled меняют возможности поля по-разному. Смена существующего типа обычно требует нового индекса и reindex; coerce не заменяет валидацию входных данных.
Создание учебного индекса: типы задаются до загрузки данных.
{
"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"
}
}
}
}Как читать результат
Создание учебного индекса: типы задаются до загрузки данных.
Разбор на примере каталога
Представьте цену 19.995 при требовании двух десятичных знаков. Сначала нужно определить бизнес-округление, а не надеяться, что floating-point тип автоматически решит денежную задачу. Артикул "00042" сохраняют строкой даже при отсутствии букв. Поле rating допускает отсутствие, но price может быть обязательным на границе загрузки. dynamic=strict не проверяет все бизнес-инварианты: документ с известными полями, но без цены, всё ещё требует отдельной проверки. Mapping задаёт способ хранения и поиска, а не полноценную бизнес-валидацию.
Неизвестное поле при dynamic=strict
{
"unknown_field": "unexpected"
}Ответ Elasticsearch
{
"error": {
"type": "strict_dynamic_mapping_exception"
},
"status": 400
}Как читать результат
После создания strict mapping неизвестное поле отклоняется. Это сокращённый фрагмент ошибки, документ не записан.
Подготовка учебного набора
Запросы к course-products в новых главах используют эту схему. После её создания запишите документ ниже. Это отдельный набор, не публичные 300 товаров тренажёра: у него brand имеет тип keyword, тогда как в упражнениях используется brand.keyword. Административные операции выполняются в собственном учебном окружении, а тренажёр остаётся доступным только для поиска. Значения и идентификаторы учебных примеров не являются ответами к упражнениям.
Первый товар учебного каталога
{
"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.