КатегорииElasticsearch

Elasticsearch — Урок 3.3 Основные типы данных

В этом уроке мы обсудим основные типы данных, поддерживаемые 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"
     }
   }
 }

Бинарные типы данных могут использоваться для записи данных, таких как изображения, сжатые большие объекты и т. д.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *