Elasticsearch: Сравнение типов Keyword и Text

Строковые литералы в Elasticsearch могут быть разных видов. Типы ключевых слов, подстановочных знаков и текстовых полей имеют разные особенности и идеально подходят для разных случаев использования. Ниже приведено объяснение различий между каждым из них и контекст, в котором следует использовать различные типы для ваших строковых полей.

Elasticsearch

Keyword в сравнении сText

По умолчанию в последних версиях Elasticsearch все строковые поля индексируются как Text и как Keyword.

Разница между Text и Keyword.

В ранних версиях Elasticsearch существовал тип поля под названием "строка". Он использовался для обеспечения полнотекстового поиска. Эти поля проходили через конвейер анализа, который выполнял такие операции, как удаление строчных букв, знаков препинания, разбиение документа на отдельные лексемы и их дальнейшая фильтрация по стоп-словам и т.д.

Этот процесс отлично подходит для поиска больших документов, но иногда такое поведение не является идеальным. Когда вы хотите отфильтровать по определенным значениям или перечислить их все с помощью агрегации, вам нужен другой тип, потому что вы не хотите, чтобы входной документ проходил через конвейер анализа. Вы хотите, чтобы он оставался не проанализированным.

Поэтому, если вы хотите использовать поле для точной фильтрации или агрегации терминов, вы должны настроить поле типа "string" с: "index" : "not_analyzed".

Именно так можно было отличить текст от ключевого слова. Поскольку это было не очень интуитивно понятно для пользователей, не знакомых с информационным поиском, были созданы 2 новых типа: текст и ключевое слово.

Начиная с версии 5 Elasticsearch по умолчанию для строковых литералов используется следующее отображение:

Различия заключаются в следующем:

  • Текст полностью анализируется и может быть использован для частичного полнотекстового сопоставления.
  • Ключевое слово (keyword) будет проиндексировано как есть без каких-либо изменений. Это идеальный вариант для агрегации терминов и фильтрации точных значений.

Keyword в сравнении с Wildcard

Если вы планируете выполнять много запросов с подстановочными знаками (wildcard), вам следует использовать тип "wildcard". Он хорошо подходит для машинного содержимого, например, для сообщений журнала, которые вы обычно перебираете в терминале.

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

Тип wildcard был представлен в Elasticsearch версии 7.9.

Text в сранении Match Only Text

Тип "match_only_text" очень похож на "text", но он экономит дисковое пространство, жертвуя гранулярной оценкой.

Примеры кода

Создайте многопольное отображение, чтобы включить все типы строк в поле сообщения:

Какой тип строки Elasticsearch следует использовать?

Используйте текстовое (text) поле, если:

  • Вы планируете выполнить обычный полнотекстовый поиск / поиск по определенному слову или фразе
  • содержимое находится в обычном, письменном тексте, таком, который человек может легко прочитать.

Используйте тип ключевого слова (keyword), если:

  • Вы планируете фильтровать точные значения
  • Вы планируете фильтровать по префиксным последовательностям символов
  • Вы планируете выполнять агрегацию терминов, например, для многогранной навигации на сайте.

Используйте тип подстановочного знака (wildcard), если:

  • Вы пытаетесь найти иголку в плохо токенизированном или машинной генерации тексте.
  • Вы не собираетесь использовать запросы, основанные на позициях слов.

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

  • Вы собираетесь использовать полнотекстовый поиск, но гранулярные показатели не очень важны для вас.
Понравилась статья? Поделиться с друзьями:
Добавить комментарий