Семейство типов text
Семейство text включает следующие типы полей:
-
text, традиционный тип поля для полнотекстового содержимого, такого как тело электронного письма или описание продукта. -
match_only_text, оптимизированная по объёму версияtext, которая отключает подсчет очков и работает медленнее с запросами, требующими позиций. Он лучше всего подходит для индексирования сообщений журналов.
Тип поля text
Поле для индексирования полнотекстовых значений, таких как тело электронного письма или описание продукта. Эти поля являются analyzed, то есть они проходят через анализатор анализатор, чтобы преобразовать строку в список отдельных терминов перед индексированием. Процесс анализа позволяет Elasticsearch искать отдельные слова внутри каждого полнотекстового поля. Поля text не используются для сортировки и редко используются для агрегаций (хотя агрегация значимого текста является заметным исключением).
Поля типа text лучше всего подходят для неструктурированного, но удобочитаемого содержимого. Если вам нужно индексировать неструктурированное содержимое, созданное машиной, см. Отображение неструктурированного содержимого.
Если вам нужно индексировать структурированное содержимое, такое как адреса электронной почты, имена хостов, коды состояния или теги, вероятно, вам следует использовать поле keyword.
Ниже приведен пример отображения поля text:
PUT my-index-000001
{
"mappings": {
"properties": {
"full_name": {
"type": "text"
}
}
}
} Использование поля как text и keyword
Иногда полезно иметь как полнотекстовую (text), так и ключевую (keyword) версию одного и того же поля: одну для полнотекстового поиска и другую для агрегаций и сортировки. Это можно сделать с помощью множественных полей.
Параметры для полей text
Следующие параметры принимаются полями text:
| Анализатор, который должен использоваться для поля | |
| Ускорение поиска на уровне поля. Принимает число с плавающей запятой, по умолчанию | |
| Должны ли глобальные порядковые номера загружаться немедленно при обновлении? Принимает | |
| Может ли поле использовать полевые данные в памяти для сортировки, агрегаций или сценариев? Принимает | |
| Экспертные настройки, которые позволяют решать, какие значения загружать в память при включении | |
| Множественные поля позволяют одному и тому же строковому значению индексироваться несколькими способами для различных целей, например, одно поле для поиска и множественное поле для сортировки и агрегаций, или одно и то же строковое значение анализируется различными анализаторами. | |
| Должно ли поле быть доступным для поиска? Принимает значение | |
| Какую информацию следует хранить в индексе для поиска и выделения. По умолчанию | |
| Если включено, префиксы терминов длиной от 2 до 5 символов индексируются в отдельное поле. Это позволяет эффективнее выполнять поиск по префиксам за счет увеличения размера индекса. | |
| Если включено, двухсловные словосочетания (шпильки) индексируются в отдельное поле. Это позволяет эффективнее выполнять точные запросы по фразам (без допускаемого разброса), за счет увеличения размера индекса. Обратите внимание, что это лучше всего работает, когда стоп-слова не удаляются, так как фразы, содержащие стоп-слова, не будут использовать вспомогательное поле и вернутся к стандартному запросу по фразе. Принимает значение | |
| Учитывать ли длину поля при оценке запросов. Принимает | |
| Количество фиктивных позиций терминов, которое должно быть вставлено между каждым элементом массива строк. По умолчанию используется значение | |
| Должно ли значение поля храниться и быть доступным отдельно от поля | |
| | |
| | |
| Какой алгоритм оценки или подобия следует использовать. По умолчанию | |
| Следует ли хранить вектор терминов для поля. По умолчанию | |
| Метаданные о поле. |
fielddata параметр отображения
Поля типа text по умолчанию доступны для поиска, но по умолчанию недоступны для агрегаций, сортировки или сценариев. Если вы попытаетесь отсортировать, агрегировать или получить доступ к значениям из скрипта для поля text, вы увидите эту ошибку:
Полевые данные для полей text по умолчанию отключены. Установите fielddata=true для your_field_name, чтобы загрузить полевые данные в память, деинвертировав инвертированный индекс. Однако обратите внимание, что это может потребовать значительного объёма памяти.
Полевые данные — единственный способ доступа к проанализированным токенам из полнотекстового поля в агрегациях, сортировке или сценариях. Например, полнотекстовое поле, такое как New York, будет проанализировано как new и york. Для агрегирования по этим токенам требуются полевые данные.
Перед включением полевых данных
Обычно нет смысла включать полевые данные для текстовых полей. Полевые данные хранятся в куче с кэшем полевых данных, так как их вычисление дорогостоящее. Вычисление полевых данных может вызвать пики задержек, а увеличение использования кучи является причиной проблем производительности кластера.
Большинство пользователей, которые хотят сделать больше с текстовыми полями, используют сопоставления многопольных отображений, имея как поле text для полных текстовых поисков, так и неанализированное поле keyword для агрегаций, как показано ниже:
PUT my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
} | Используйте поле | |
| Используйте поле |
Включение полевых данных для полей text
Вы можете включить полевые данные для существующего поля text, используя API обновления сопоставления, как показано ниже:
PUT my-index-000001/_mapping
{
"properties": {
"my_field": {
"type": "text",
"fielddata": true
}
}
} | Сопоставление, которое вы указываете для |
fielddata_frequency_filter параметр сопоставления
Фильтр полевых данных может использоваться для уменьшения количества терминов, загружаемых в память, и, следовательно, уменьшения использования памяти. Термины могут быть отфильтрованы по частоте:
Фильтр частоты позволяет загружать только термины, частота документов которых находится между значением min и max, что может быть выражено абсолютным числом (если число больше 1.0) или в процентах (например, 0.01 - это 1%, а 1.0 - 100%). Частота рассчитывается по сегменту. Проценты основаны на количестве документов, имеющих значение для поля, а не на всех документах в сегменте.
Небольшие сегменты могут быть полностью исключены путем указания минимального количества документов, которое сегмент должен содержать с min_segment_size:
PUT my-index-000001
{
"mappings": {
"properties": {
"tag": {
"type": "text",
"fielddata": true,
"fielddata_frequency_filter": {
"min": 0.001,
"max": 0.1,
"min_segment_size": 500
}
}
}
}
} Тип поля текстового только для соответствия
Вариант text, который обменивает оценку и эффективность позиционных запросов на эффективность использования пространства. Это поле фактически хранит данные так же, как поле text, которое индексирует только документы (index_options: docs) и отключает нормы (norms: false). Запросы по терминам выполняются так же быстро, как и на полях text, но запросы, которым нужны позиции, такие как запрос match_phrase, выполняются медленнее, так как им нужно посмотреть на документ _source, чтобы проверить, соответствует ли фраза. Все запросы возвращают постоянные оценки, равные 1,0.
Анализ не настраивается: текст всегда анализируется с помощью анализатора по умолчанию (standard по умолчанию).
Запросы span не поддерживаются с этим полем, используйте вместо них запросы интервалов или тип поля text, если вам абсолютно необходимы запросы span.
Помимо этого, match_only_text поддерживает те же запросы, что и text. И, как и text, он не поддерживает сортировку и имеет только ограниченную поддержку агрегаций.
PUT logs
{
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"message": {
"type": "match_only_text"
}
}
}
} Параметры для полей текста только для соответствия
Принимаются следующие параметры сопоставления:
| Многопольные отображения позволяют одному и тому же строковому значению индексироваться несколькими способами для различных целей, например, одно поле для поиска и многопольное поле для сортировки и агрегаций, или одно и то же строковое значение, анализируемое различными анализаторами. | |
| Метаданные о поле. |
© 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/text.html