Explicit mapping

Тема дорожной карты · Elasticsearch

Явный маппинг в Elasticsearch означает заблаговременное определение типов полей, анализаторов и параметров индексирования для индекса через PUT /<index>/_mapping или включение блока mappings в запрос создания индекса — вместо того чтобы полагаться на автоматическое определение типов при динамическом маппинге. Явный маппинг даёт точный контроль над тем, как Elasticsearch хранит и выполняет поиск по каждому полю: строковое поле можно обозначить как text с пользовательским анализатором для полнотекстового поиска, как keyword для точной фильтрации и агрегаций или использовать оба типа через определение мультиполя. Числовые поля — integer, long, float, double — следует объявлять явно, чтобы избежать ситуации, когда Elasticsearch маппирует JSON-число как long, тогда как более конкретный тип сократил бы объём хранения и улучшил производительность агрегаций. Установка dynamic: strict в явном маппинге предотвращает индексирование будущих документов с непредвиденными полями, что помогает поддерживать дисциплину схемы в производственных индексах Elasticsearch. Явные маппинги не могут быть изменены для существующих полей после индексирования данных; для изменения типа поля необходимо создать новый индекс с исправленным маппингом и переиндексировать данные через POST /_reindex.

Как это работает

Explicit mapping определяют типы полей + как они индексируются/анализируются. Dynamic mapping auto-detect-ит типы из первого документа — удобно, но опасно (строка "12345" становится long, потом ломается при реальной строке). Explicit mapping — то что вам нужно в prod. Типы полей: text (analysed, searchable, не aggregatable), keyword (exact, aggregatable, sortable), long/double, date, boolean, nested, geo_point. Analyzers обрабатывают текст: tokenize → filter (lowercase, stop words, stemming). Распространённые: standard, english, custom analyzers per язык.

Когда применять

Всегда explicit mapping в production — dynamic mapping делает один плохой doc отравлением индекса. Subfields: text поле с .keyword для search + aggregation. Analyzers per язык (russian analyzer для русского). Отключайте _source только с большой осторожностью — теряете возможность reindex.

Типичные ошибки

Ловушки Explicit mapping: dynamic mapping (первый weird doc ломает schema); только text — нельзя aggregate, нельзя сортировать; неправильный analyzer (English на русском → нет stemming, плохие результаты); слишком много полей ("field explosion" — > 1000 полей упирается в лимиты).

Связанные понятия

Полезные ресурсы