Что такое Mapping

Elasticsearch индексирует любой документ, не зная о его полях. Однако за кулисами Elasticsearch назначает типы данных вашим полям в сопоставлении (Mapping). Mapping - это определение схемы, которое содержит имена и типы данных полей индекса. Он также содержит информацию о том, как поля должны индексироваться и храниться в Lucene. Mapping сопоставляют ваши сложные документы JSON с простыми плоскими документами, которые ожидает Lucene.

Если вы хотите проверить сопоставление существующего индекса, вы можете использовать _mapping.

GET mylogs/_mapping

В результате вы получите список всех полей и их типов.

Типы полей

Тип Описание
Text Этот тип используется для хранения полнотекстовых строк. В частности, он используется для индексации текста, который вы хотите проанализировать
Keyword Этот тип используется для хранения строк точных значений. Обычно это используется для фильтрации, сортировки и агрегирования строк. Значения в полях ключевых слов будут попадать только в том случае, если они точно совпадают.
date Вы можете использовать тип date или date_nanos для сопоставления полей, содержащих строки, отформатированные как даты или числовые даты
Integer Вы можете хранить целые числа одного из следующих типов: byte, short, integer, long. Вы должны выбрать наименьший тип, которого будет достаточно для вашего случая использования. Это повысит производительность операций с индексами и запросами.
Floating Point Number Числа с плавающей запятой могут быть отображены в один из следующих типов: float, double, half_float или scaled_float.
Boolean Логические поля принимают значения JSON true и false
IP Этот тип можно использовать для хранения адресов IPv4 или IPv6
Hierarchical Types Есть несколько иерархических типов, таких как nested, join, object
Specialized Вы можете использовать множество других типов данных, которые предназначены для конкретных случаев использования. Например, вы можете использовать geo_point и geo_shape, когда хотите проиндексировать географические данные

Динамический Mapping (Dynamic Mapping)

Вы можете индексировать документы, не определяя сопоставления (mapping) заранее. Это связано с тем, что при индексировании документа по умолчанию Elasticsearch динамически создает или обновляет сопоставление (mapping) по мере необходимости.

Когда вы индексируете первый документ, Elasticsearch проверяет тип JSON полей, чтобы определить их и сопоставить.

По типу JSON поля Elasticsearch угадывает связанный тип данных. Например, если вы индексируете целое число, Elasticsearch создаст отображение типа long для этого поля.

Dynamic Mapping не всегда будет оптимальным. Например некоторые поля с целыми числами могут быть сопоставлены как long 64-bits вместо возможных short. Так что в случае если вы заранее знаете количество символов лучше сопоставлять тип самостоятельно.

Пример **сопоставления (mapping) **

PUT mylogs
{
  "mappings": {
    "properties": {
      "my_fiels": {
	     "type": "short"
	   }
	 }
  }
}

GET mylogs/_mapping

Изменение сопоставленного поля

После того как сопоставление было определено для данного поля, изменить его тип данных в невозможно. Причина, по которой вы не можете изменить сопоставление, заключается в том, что при переключении типа данных поля вы просите Lucene изменить структуру данных, которую она использует для хранения всех значений в поле. Это означает, что все значения из документов, которые уже были проиндексированы, станут недоступными для поиска. Если вам нужно изменить тип данных поля, вам необходимо переиндексировать все ваши документы в новый индекс.

Тем не менее, вы всегда можете добавить новые поля без переиндексации.