В этом уроке мы обсудим основные типы данных, поддерживаемые Elasticsearch.
Text
Начиная с Elasticsearch 5.0, тип string
устарел и в заменен пришли сразу два типа данных text
и keyword
. Если вы хотите выполнить полнотекстовый поиск, вы должны использовать тип text
. Если вы хотите только точное совпадение, вы должны использовать тип keyword
.
Предположим у нас есть документ, содержащий следующие поля:
{
"date": "2017-01-01",
"description": "Грозный рыцарь потребовал сатисфакции поединком, дабы победить врага на ристалище!"
}
Чтобы иметь возможность воспользоваться полнотекстовым поиском для поля description мы должный указать в схеме тип text. Вы можете это сделать, как показано ниже:
PUT example3/_mapping/news { "properties": { "description": { "type": "text", "analyzer": "russian" } } }
Текстовое отображение также принимает несколько необязательных параметров:
- analyzer: выбор анализатора, который следует использовать при индексировании и поиске.
- boost : Boost помогает упорядочить результаты поиска. Когда один или несколько документов имеют одинаковый показатель соответствия, повышение поля помогает упорядочить результаты. По умолчанию все поля в документе одинаково важны. Значение по умолчанию
1.0
. Вы можете установить больше например2.0
. - fielddata : Fielddata — это структура данных в памяти, используемая для поддержки сортировки и агрегации для текстовых полей. Значение по умолчанию false.
- fields: Например, у вас есть заголовок элемента, который может быть на английском или немецком языке. Multifields позволит вам индексировать поле заголовка с помощью анализатора английского языка и немецкого, дабы была возможность искать на обоих языках.
- include_in_all : Это свойство касается того, следует ли включать это поле в поле
_all
. Поле_all
помогает искать по всем полям в документе без указания поля. - index : используется, если вы хотите, чтобы поле было доступно для поиска.
- index_options : при добавлении поля в инвертированный индекс это свойство указывает, нужно ли хранить какую-либо дополнительную информацию.
- norms: это используется при подсчете результатов, чтобы определить, следует ли учитывать длину поля.
- position_increment_gap: это свойство может быть настроено на лучшую поддержку фазовых запросов. По умолчанию 100
- store : Это определяет, должно ли поле быть сохранено в поле
_source
. - search_analyzer: по умолчанию для поиска используется тот же анализатор, который используется для индексирования. Вы можете изменить
search_analyzer
используя это свойство - search_quote_analyzer : Если вы ищете фразу и хотите, чтобы фраза была проанализирована по-разному, это свойство можно установить. По умолчанию используется search_analyzer
- similarity: результаты поискового запроса оцениваются на основе алгоритма подобия, указанного в этом свойстве. По умолчанию BM25.
- term_vector: когда поле разбивается на отдельные термины, это свойство контролирует, нужно ли хранить векторы-члены.
Некоторые из вышеупомянутых свойств могут быть очень продвинутыми. Мы разберем их более подробно в следующих уроках.
Keyword
В предыдущем разделе мы обсудили тип text
, который используется для полнотекстового поиска. Тип keyword должен использоваться, если вы хотите получить точное совпадение. Например, имя, адрес электронной почты, город и т. д.
Например так:
PUT example3/_mapping/user { "properties": { "email": { "type": "keyword" } } }
Так же тип данных keyword следует использовать для полей, требующих сортировки или агрегации.
Date
Тип данных date используется для представления полей даты в Elasticsearch. В JSON поля даты передаются как строка. Чтобы правильно разобрать дату, вы должны сообщить Elasticsearch, как форматируется данная строка. Если формат не указан, Elasticsearch пытается проанализировать поле даты, используя yyyy-MM-dd'T'HH:mm:ssz
формат, также известный как strict_date_optional_time.
Пример документа:
{
"creation_date": "2017-01-01",
"desc": "Грозный рыцарь потребовал сатисфакции поединком, дабы победить врага на ристалище!"
}
Указать формат даты можно так, как показано ниже:
PUT example3/_mapping/news { "properties": { "creation_date": { "type": "date", "format": "yyyy-MM-dd" } } }
Если вы ожидаете дату в нескольких форматах, вы можете указать несколько форматов, разделенных ||
в поле формата. Он будет пробовать каждый формат, пока он не найдет успешный:
PUT example3/_mapping/news { "properties": { "creation_date": { "type": "date", "format": "YYYY-mm-dd||YYYY-mm-dd HH:mm:ss" } } }
Даты без указания в часового пояса сохраняются в формате UTC ( Universal Time Coordinated ). Внутренне поле date хранится как длинное число, которое представляет собой миллисекунды, прошедшие с 1 января 1970 года.
Numeric
Числовые типы поддерживаемые Elasticsearch:
- long: 64-битное целое число
- integer: 32-битное целое число
- short: 16-битное целое число
- byte: 8-битное целое число
- double: вещественное число с двойной точностью
- float: вещественное число с одинарной точностью
- half_float: float с половинной точностью
- scaled_float: это float, но храниться как long, c помощью умножения на коэффициент масштабирования.
Вы можете выбрать тип данных, который наилучшим образом соответствует вашим потребностям, поскольку Elasticsearch оптимизирует внутреннее хранилище независимо от выбранного вами типа. Стоит упомянуть тип scaled_float
. Так как float хранить достаточно дорогое удовольствие по сравнению с целыми числами, Elasticsearch пытается оптимизировать это, сохраняя float как целое число. Он преобразует float в целое число, умножая значение float на коэффициент масштабирования. Например:
{
"date": "2017-01-01",
"city": "Москва"
"temperature" : "25.50"
}
Поскольку температура может иметь только две десятичные точки, вы можете сохранить поле temperature
как scaled_float
и установить коэффициент масштабирования 100
. Вот так:
PUT example3/_mapping/weather { "properties": { "temperature": { "type": "scaled_float", "scaling_factor": "100" } } }
По факту сохраниться, как 71.50 * 100
то есть 7150
. Чем выше коэффициент масштабирования, тем больше памяти используется для хранения значения float.
Boolean
Булевский тип данных используется для представления логических полей (true или false). Задается следующим образом:
PUT example3/_mapping/boolean { "properties": { "boolean_field": { "type": "boolean" } } }
Binary
Бинарный тип данных используется для хранения закодированной в Base64
строки. Поля двоичных типов данных не индексируются и по умолчанию просто сохраняется. Задается так:
PUT example3/_mapping/binary { "properties": { "binary_field": { "type": "binary" } } }
Бинарные типы данных могут использоваться для записи данных, таких как изображения, сжатые большие объекты и т. д.