Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›Mapping ›Типы данных полей

Семейство типов данных Keyword

Семейство ключевых слов включает следующие типы полей:

  • keyword, который используется для структурированного содержимого, такого как идентификаторы, адреса электронной почты, имена хостов, коды состояния, почтовые индексы или теги.
  • constant_keyword для полей ключевых слов, которые всегда содержат одно и то же значение.
  • wildcard для неструктурированного содержимого, сгенерированного машиной. Тип wildcard оптимизирован для полей с большими значениями или высокой кратностью.

Поля ключевых слов часто используются в сортировке, агрегациях и запросах на уровне терминов, таких как term.

Избегайте использования полей ключевых слов для полнотекстового поиска. Используйте тип поля text вместо этого.

Тип поля ключевого слова

Ниже приведен пример сопоставления для базового поля keyword:

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "tags": {
        "type":  "keyword"
      }
    }
  }
}

Сопоставление числовых идентификаторов

Не все числовые данные следует сопоставлять как тип данных поля числового поля. Elasticsearch оптимизирует числовые поля, такие как integer или long, для range запросов. Однако поля keyword лучше подходят для term и других запросов на уровне терминов.

Идентификаторы, такие как ISBN или идентификатор продукта, редко используются в range запросах. Однако они часто извлекаются с помощью запросов на уровне терминов.

Рассмотрите возможность сопоставления числового идентификатора как keyword, если:

  • Вы не планируете искать данные идентификатора с помощью range запросов.
  • Важно быстрое извлечение. Запросы запросов term по полям keyword часто быстрее, чем term по числовым полям.

Если вы не уверены, какой из них использовать, вы можете использовать многопольное поле для сопоставления данных как keyword и числового типа данных.

Параметры для базовых полей ключевых слов

Следующие параметры принимаются полями keyword:

boost
Усиление запросов на уровне поля. Принимает число с плавающей точкой, по умолчанию 1.0.
doc_values
Должно ли поле храниться на диске в виде столбцов, чтобы оно могло использоваться для сортировки, агрегации или скриптов? Принимает true (по умолчанию) или false.
eager_global_ordinals
Должны ли глобальные ординалы загружаться в режиме ожидания при обновлении? Принимает true или false (по умолчанию). Включение этого параметра полезно для полей, которые часто используются для агрегации терминов.
fields
Многопольные поля позволяют одному и тому же строковому значению индексироваться различными способами для разных целей, например, одно поле для поиска и многопольное поле для сортировки и агрегации.
ignore_above
Не индексировать строки длиннее этого значения. По умолчанию 2147483647, чтобы все значения принимались. Обратите внимание, что динамические правила сопоставления по умолчанию создают подполе keyword, которое переопределяет этот параметр по умолчанию, установив ignore_above: 256.
index
Должно ли поле быть доступным для поиска? Принимает true (по умолчанию) или false.
index_options
Какая информация должна храниться в индексе для целей оценки. По умолчанию docs, но также может быть установлена на freqs, чтобы учесть частоту термина при расчете оценок.
meta
Метаданные о поле.
norms
Следует ли учитывать длину поля при оценке запросов. Принимает true или false (по умолчанию).
null_value
Принимает строковое значение, которое подставляется для явных null значений. По умолчанию null, что означает, что поле считается отсутствующим. Обратите внимание, что этот параметр не может быть установлен, если используется значение script.
on_script_error
Определяет, что делать, если скрипт, определенный параметром script, выдает ошибку при индексировании. Принимает fail (по умолчанию), что приведет к отклонению всего документа, и continue, что зарегистрирует поле в метаданных документа _ignored и продолжит индексирование. Этот параметр может быть установлен только в том случае, если также установлен параметр script.
script
Если этот параметр установлен, поле будет индексировать значения, сгенерированные этим скриптом, а не читать значения напрямую из источника. Если для этого поля задано значение в документе входных данных, документ будет отклонен с ошибкой. Скрипты имеют тот же формат, что и их аналогичные. Значения, выводимые скриптом, обычно нормализуются и игнорируются, если они длиннее значения, установленного в ignore_above.
store
Следует ли хранить значение поля отдельно от поля _source. Принимает true или false (по умолчанию).
similarity
Какой алгоритм оценки или сходства следует использовать. По умолчанию BM25.
normalizer
Как предварительно обработать ключевое слово перед индексированием. По умолчанию null, что означает, что ключевое слово сохраняется как есть.
split_queries_on_whitespace
Следует ли разделить входные данные на пробелы при построении запроса для этого поля при полнотекстовых запросах. Принимает true или false (по умолчанию).
time_series_dimension

[preview] Эта функциональность находится в предварительном техническом режиме и может быть изменена или удалена в будущих выпусках. Elastic будет работать над исправлением любых проблем, но функции в предварительном техническом режиме не подпадают под SLA поддержки официальных функций GA. (Необязательный, логический)

Для внутреннего использования Elastic.

Помечает поле как временную серию измерения. По умолчанию false.

Настройка индекса index.mapping.dimension_fields.limit ограничивает количество измерений в индексе.

Поля измерений имеют следующие ограничения:

  • Параметры сопоставления doc_values и index должны быть true.
  • Значения поля не могут быть массивом или многозначными.
  • Значения поля не могут быть больше 1024 байт.
  • Поле не может использовать normalizer.

Тип поля постоянного ключевого слова

Постоянное ключевое слово — это специализация поля keyword в случае, если все документы в индексе имеют одинаковое значение.

PUT logs-debug
{
  "mappings": {
    "properties": {
      "@timestamp": {
        "type": "date"
      },
      "message": {
        "type": "text"
      },
      "level": {
        "type": "constant_keyword",
        "value": "debug"
      }
    }
  }
}

constant_keyword поддерживает те же запросы и агрегации, что и поля keyword, но использует тот факт, что все документы имеют одинаковое значение в индексе, чтобы выполнять запросы более эффективно.

Разрешается отправлять документы, не имеющие значения для поля, или имеющие значение, равное значению, настроенному в сопоставлениях. Два запроса индексирования ниже эквивалентны:

POST logs-debug/_doc
{
  "date": "2019-12-12",
  "message": "Starting up Elasticsearch",
  "level": "debug"
}

POST logs-debug/_doc
{
  "date": "2019-12-12",
  "message": "Starting up Elasticsearch"
}

Однако предоставление значения, отличного от значения, настроенного в сопоставлениях, запрещено.

Если значение value не указано в сопоставлениях, поле автоматически настраивается на основе значения, содержащегося в первом индексированном документе. Хотя это поведение может быть удобным, имейте в виду, что это означает, что один проблемный документ может привести к отклонению всех остальных документов, если в нем было неправильное значение.

Перед тем, как значение будет предоставлено (либо через сопоставления, либо из документа), запросы к полю не будут соответствовать никаким документам. Это включает в себя запросы exists.

value поля изменить после его задания нельзя.

Параметры для постоянных полей типа keyword

Принимаются следующие параметры сопоставления:

meta

Метаданные о поле.

value

Значение, которое следует сопоставить со всеми документами в индексе. Если этот параметр не указан, он устанавливается на основе первого проиндексированного документа.

Тип поля wildcard

Тип поля wildcard — специализированное поле типа keyword для неструктурированного машиногенерированного контента, который планируется искать с помощью запросов, подобных grep, wildcard и regexp. Тип wildcard оптимизирован для полей с большими значениями или высокой кардинальностью.

Сопоставление неструктурированного контента

Вы можете сопоставить поле, содержащее неструктурированный контент, либо с полем типа text, либо с полем семейства keyword. Лучший тип поля зависит от характера контента и того, как вы планируете искать в этом поле.

Используйте тип поля text, если:

  • Контент удобочитаем, например, тело электронного письма или описание продукта.
  • Вы планируете искать в поле отдельные слова или фразы, например, the brown fox jumped, используя полнотекстовые запросы. Elasticsearch анализирует поля типа text, чтобы возвращать наиболее релевантные результаты для этих запросов.

Используйте поле семейства keyword, если:

  • Контент сгенерирован машиной, например, сообщение журнала или информация запроса HTTP.
  • Вы планируете искать в поле точные полные значения, например, org.foo.bar, или частичные последовательности символов, например, org.foo.*, используя запросы на уровне терминов.

Выбор типа поля семейства keyword

Если вы выбираете тип поля семейства keyword, вы можете сопоставить поле как поле типа keyword или wildcard, в зависимости от кардинальности и размера значений поля. Используйте тип wildcard, если планируете регулярно искать в поле с помощью wildcard или regexp запроса и выполняются следующие критерии:

  • Поле содержит более миллиона уникальных значений.
    И
    Вы планируете регулярно искать в поле с шаблоном, содержащим ведущие подстановки, такие как *foo или *baz.
  • Поле содержит значения, превышающие 32 КБ.
    И
    Вы планируете регулярно искать в поле с любым шаблоном подстановок.

В противном случае используйте тип поля keyword для более быстрых поисков, более быстрого индексирования и меньших затрат на хранение. Подробное сравнение и блок-схема принятия решений см. в нашей статье блога.

Переключение с поля text на поле keyword

Если вы ранее использовали поле text для индексирования неструктурированного машиногенерированного контента, вы можете переиндексировать для обновления сопоставления на поле keyword или wildcard. Также рекомендуется обновить ваше приложение или рабочий процесс, чтобы заменить любые поисковые запросы на основе слов полнотекстового поиска на эквивалентные запросы на уровне терминов.

Внутренне поле wildcard индексирует всё значение поля с помощью ngrams и сохраняет полную строку. Индекс используется как грубый фильтр для сокращения количества значений, которые затем проверяются путём извлечения и проверки полных значений. Это поле особенно хорошо подходит для выполнения запросов, подобных grep, к строкам логов. Затраты на хранение обычно ниже, чем затраты на поля keyword, но скорость поиска точных совпадений по полным терминам медленнее. Если значения полей имеют много общих префиксов, таких как URL для одного веб-сайта, затраты на хранение для поля wildcard могут быть выше, чем для эквивалентного поля keyword.

Вы индексируете и ищете в поле wildcard следующим образом

PUT my-index-000001
{
  "mappings": {
    "properties": {
      "my_wildcard": {
        "type": "wildcard"
      }
    }
  }
}

PUT my-index-000001/_doc/1
{
  "my_wildcard" : "This string can be quite lengthy"
}

GET my-index-000001/_search
{
  "query": {
    "wildcard": {
      "my_wildcard": {
        "value": "*quite*lengthy"
      }
    }
  }
}

Параметры для полей wildcard

Следующие параметры принимаются полями wildcard:

null_value

Принимает строковое значение, которое подставляется вместо явных значений null. По умолчанию установлено null, что означает, что поле рассматривается как отсутствующее.

ignore_above

Не индексировать никакие строки, длина которых превышает это значение. По умолчанию установлено 2147483647, так что все значения будут приняты.

Ограничения

  • Поля типа wildcard не токенизированы, как поля типа keyword, поэтому не поддерживают запросы, которые зависят от позиций слов, такие как запросы на фразу.
  • При выполнении запросов wildcard любой параметр rewrite игнорируется. Оценка всегда постоянна.

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/keyword.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API