Dynamic mapping
Тема дорожной карты · Elasticsearch
Динамический маппинг в Elasticsearch — это функция, автоматически определяющая и добавляющая новые поля в маппинг индекса при первом индексировании документа с этими полями, без необходимости заранее определять схему. Когда Elasticsearch встречает новый JSON-ключ, он определяет подходящий тип поля: строка, похожая на дату, становится полем date, число без десятичной части — long, а произвольный текст маппируется одновременно как поле text (для полнотекстового поиска) и подполе keyword (для точной фильтрации и агрегаций). Динамический маппинг управляется настройкой dynamic на уровне индекса или объекта: значение true (по умолчанию) включает автоматическое добавление полей, false молча игнорирует неизвестные поля, а "strict" заставляет Elasticsearch отклонять документы с неотображёнными полями. Хотя динамический маппинг удобен при разработке и в конвейерах обработки логов, производственные поисковые системы, как правило, используют явные маппинги, чтобы избежать непреднамеренного вывода типов полей и раздувания индекса из-за взрывного роста маппинга. Просмотреть текущий маппинг индекса всегда можно через GET /<index>/_mapping.
Как это работает
Dynamic 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.
Типичные ошибки
Ловушки Dynamic mapping: dynamic mapping (первый weird doc ломает schema); только text — нельзя aggregate, нельзя сортировать; неправильный analyzer (English на русском → нет stemming, плохие результаты); слишком много полей ("field explosion" — > 1000 полей упирается в лимиты).