Иногда появляется потребность поддерживать разные запросы для одного и того же поля. Например у нас есть поле заголовка title и мы хотим делать как полнотекстовые запросы так и запросы на точное соответствие. Первое что приходит на ум, это создать два поля и указать им разные типы данных, например:
{ "properties": { "title_text": { "type": "text" }, "title_keyword": { "type": "keyword" } } }
Предположим вы добавили следующий документ:
{ "title_text" : "Learning Elasticsearch", "title_keyword" : "Learning Elasticsearch" }
Заметьте что документ содержит дублирование данных, как в принципе и предполагалось. Чтобы избежать дублирования данных при индексировании и хранении документа, Elasticsearch предоставляет возможность индексировать одно поле с указанием нескольких типов данных, данная возможность называется fieldsmapping (сопоставление полей).
Используя сопоставление полей, одно и то же поле можно индексировать как text, так и keyword. Как показано ниже, поле title
индексируется как text и title.exact будет индексироваться как keyword, которое может использоваться для поиска точного совпадения, сортировки и т. д.
Пример маппинга:
{ "properties": { "title": { "type": "text", "fields": { "exact": { "type": "keyword" } } } } }
Теперь можно добавлять документы без дублирования данных:
{ "title" : "Learning Elasticsearch" }
Теперь у нас два поля title c типом text и title.exact с типом keyword.