Динамические шаблоны в Elasticsearch - это мощный инструмент, позволяющий определять пользовательские маппинги, которые можно применять к динамически добавляемым полям. Они обеспечивают гибкий способ управления тем, как Elasticsearch будет обрабатывать новые поля, которые еще не определены в маппинге.
Динамические шаблоны определяются в типе маппинга и могут быть заданы во время создания индекса или обновлены позже с помощью API маппинга PUT. Они особенно полезны, когда у вас есть большое количество полей с похожими именами или типами, и вы хотите применить один и тот же маппинг ко всем из них.
Давайте разберемся, как использовать динамические шаблоны в Elasticsearch.
Создание динамических шаблонов
Чтобы создать динамический шаблон, вам нужно использовать секцию "dynamic_templates" в вашем маппинге. Вот пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | PUT /my_index { "mappings": { "dynamic_templates": [ { "integers": { "match_mapping_type": "long", "mapping": { "type": "integer" } } } ] } } |
В этом примере любое новое поле, имеющее тип "long", будет маппинга как "integer". Параметр "match_mapping_type" используется для соответствия типу данных нового поля.
Сопоставление имен полей
Вы также можете сопоставить имена полей с помощью параметров "match" или "unmatch". Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | PUT /my_index { "mappings": { "dynamic_templates": [ { "strings_as_keyword": { "match_mapping_type": "string", "match": "*_keyword", "mapping": { "type": "keyword" } } } ] } } |
В этом примере любое новое строковое поле, заканчивающееся на "_keyword", будет маппингом как "ключевое слово".
Использование динамических шаблонов с несколькими полями
Динамические шаблоны также можно использовать с несколькими полями. Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | PUT /my_index { "mappings": { "dynamic_templates": [ { "strings": { "match_mapping_type": "string", "mapping": { "type": "text", "fields": { "raw": { "type": "keyword" } } } } } ] } } |
В этом примере любое новое строковое поле будет маппингом поля "текст" с мультиполем типа "ключевое слово".
Порядок динамических шаблонов
Порядок следования динамических шаблонов имеет значение. Elasticsearch применит первый подходящий шаблон в списке. Если ни один шаблон не подходит, Elasticsearch будет использовать свои правила по умолчанию для динамического маппинга.
Отключение динамического маппинга
Если вы хотите отключить динамический маппинг для определенных полей, вы можете использовать параметр "dynamic" в своем маппинге:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | PUT /my_index { "mappings": { "dynamic": "strict", "properties": { "user": { "properties": { "name": { "type": "text" }, "role": { "type": "keyword" } } } } } } |
В этом примере, если документ будет проиндексирован с дополнительным полем, Elasticsearch выбросит исключение, потому что параметр "dynamic" установлен в значение "strict". Если вы хотите, чтобы документ все же был проиндексирован, но без выброса ошибки, вы можете установить для параметра "dynamic" значение "false". В этом случае документ будет проиндексирован, но поля, не объявленные в явном виде в маппинге, не будут проиндексированы и, следовательно, не будут доступны для поиска.
Заключение
Динамические шаблоны в Elasticsearch предоставляют мощный и гибкий способ управления тем, как Elasticsearch обрабатывает динамически добавляемые поля. Понимая и используя динамические шаблоны, вы можете гарантировать, что ваши данные будут индексироваться и искаться наиболее эффективным способом.