Семейство типов text
Семейство типов text включает следующие типы полей:
-
text, традиционный тип поля для полнотекстового содержимого, например, тела электронного письма или описания продукта. -
match_only_text, оптимизированная по памяти версияtext, которая отключает вычисление релевантности и работает медленнее с запросами, требующими позиций. Она лучше всего подходит для индексации журнальных сообщений.
Тип поля text
Поле для индексирования значений полного текста, таких как тело электронного письма или описание продукта. Эти поля являются analyzed, то есть они проходят через анализатор, чтобы преобразовать строку в список отдельных терминов перед индексированием. Этот процесс анализа позволяет Elasticsearch искать отдельные слова внутри каждого поля полного текста. Поля text не используются для сортировки и редко используются для агрегаций (хотя значимая агрегация текстов является заметным исключением).
Поля типа text наилучшим образом подходят для неструктурированного, но удобочитаемого содержимого. Если вам нужно индексировать неструктурированное содержимое, сгенерированное машиной, см. Отображение неструктурированного содержимого.
Если вам нужно индексировать структурированное содержимое, такое как адреса электронной почты, имена хостов, коды состояния или теги, скорее всего, вам следует использовать поле keyword.
Ниже приведен пример отображения для поля text:
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"full_name": {
"type": "text"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
full_name: {
type: 'text'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
full_name: {
type: "text",
},
},
},
});
console.log(response); PUT my-index-000001
{
"mappings": {
"properties": {
"full_name": {
"type": "text"
}
}
}
} Использование поля как text и keyword
Иногда полезно иметь как полнотекстовую (text), так и ключевую (keyword) версию одного и того же поля: одну для полнотекстового поиска и другую для агрегаций и сортировки. Это можно сделать с помощью multi-fields.
Параметры для полей text
Следующие параметры принимаются полями типа text:
| Анализатор, который должен использоваться для поля | |
| Нужно ли загружать глобальные ординалы при обновлении? Принимает | |
| Может ли поле использовать полевые данные в памяти для сортировки, агрегаций или скриптов? Принимает | |
| Специальные настройки, которые позволяют определить, какие значения загружать в память, когда | |
| Multi-fields позволяют индексировать одно и то же строковое значение несколькими способами для разных целей, например, одно поле для поиска и multi-поле для сортировки и агрегаций, или одно строковое значение, проанализированное разными анализаторами. | |
| Должно ли поле быть доступным для поиска? Принимает | |
| Какая информация должна храниться в индексе для поиска и выделения. По умолчанию | |
| Если включено, префиксы терминов длиной от 2 до 5 символов индексируются в отдельное поле. Это позволяет более эффективно выполнять поиски по префиксам, но увеличивает размер индекса. | |
| Если включено, двухсловные словосочетания (шинглы) индексируются в отдельное поле. Это позволяет более эффективно выполнять точные запросы по фразам (без отклонений), но увеличивает размер индекса. Обратите внимание, что это работает лучше, когда стоп-слова не удаляются, так как фразы, содержащие стоп-слова, не будут использовать вспомогательное поле и вернутся к стандартному запросу по фразе. Принимает | |
| Следует ли учитывать длину поля при оценке результатов поиска. Принимает | |
| Количество фиктивных позиций терминов, которые должны быть вставлены между каждым элементом массива строк. По умолчанию используется значение, заданное для анализатора, по умолчанию | |
| Должны ли значения поля храниться и быть доступными отдельно от поля | |
| Анализатор, который должен использоваться при поиске в поле | |
| Анализатор, который должен использоваться при поиске по фразе. По умолчанию используется значение | |
| Какой алгоритм оценки или подобия следует использовать. По умолчанию | |
| Необходимо ли сохранять векторы терминов для поля. По умолчанию | |
| Метаданные о поле. |
Синтетический _source
Синтетический _source доступен только для индексов TSDB (индексы, для которых index.mode установлено в значение time_series). Для других индексов синтетический _source находится в техническом превью. Функции в техническом превью могут быть изменены или удалены в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции в техническом превью не подпадают под SLA поддержки официальных функций GA.
Поля text поддерживают синтетический _source, если они имеют подполе keyword, которое поддерживает синтетический _source, или если поле text устанавливает store в значение true. В любом случае, он может не иметь copy_to.
Если используется подполе keyword, то значения сортируются так же, как и значения поля keyword. По умолчанию это означает сортировку с удалением дубликатов. Таким образом:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"text": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"text": [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog"
]
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
text: {
type: "text",
fields: {
raw: {
type: "keyword",
},
},
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
text: [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog",
],
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"text": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
PUT idx/_doc/1
{
"text": [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog"
]
} Преобразуется в:
{
"text": [
"jumped over the lazy dog",
"the quick brown fox"
]
} Переупорядочение текстовых полей может повлиять на запросы фразы и запросы span. Подробнее см. обсуждение position_increment_gap. Этого можно избежать, убедившись, что параметр slop в запросах фразы меньше, чем position_increment_gap. Это значение по умолчанию.
Если поле text устанавливает store в значение true, то порядок и дубликаты сохраняются.
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"text": {
"type": "text",
"store": True
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"text": [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog"
]
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
text: {
type: "text",
store: true,
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
text: [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog",
],
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"text": { "type": "text", "store": true }
}
}
}
PUT idx/_doc/1
{
"text": [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog"
]
} Преобразуется в:
{
"text": [
"the quick brown fox",
"the quick brown fox",
"jumped over the lazy dog"
]
}
fielddata параметр сопоставления
Поля text по умолчанию доступны для поиска, но по умолчанию недоступны для агрегаций, сортировки или скриптов. Если вы попытаетесь отсортировать, агрегировать или получить доступ к значениям из поля text с помощью скрипта, вы увидите исключение, указывающее на то, что данные поля по умолчанию отключены для текстовых полей. Для загрузки данных поля в память установите параметр fielddata=true для вашего поля.
Загрузка данных поля в память может значительно увеличить потребление памяти.
Данные поля — единственный способ доступа к обработанным токенам из поля полного текста в агрегациях, сортировке или скриптах. Например, поле полного текста, такое как New York, будет обработано как new и york. Для агрегации по этим токенам необходимы данные поля.
Перед включением fielddata
Обычно не имеет смысла включать fielddata для текстовых полей. Данные поля хранятся в куче с кэшем данных поля, потому что их вычисление дорогостоящее. Вычисление данных поля может привести к всплескам задержек, а увеличение использования кучи является причиной проблем с производительностью кластера.
Большинство пользователей, которые хотят работать с текстовыми полями больше, используют сопоставления нескольких полей, имея как поле text для полнотекстового поиска, так и необработанное поле keyword для агрегаций, как показано ниже:
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
my_field: {
type: 'text',
fields: {
keyword: {
type: 'keyword'
}
}
}
}
}
}
)
puts response res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}`)),
)
fmt.Println(res, err) const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
my_field: {
type: "text",
fields: {
keyword: {
type: "keyword",
},
},
},
},
},
});
console.log(response); PUT my-index-000001
{
"mappings": {
"properties": {
"my_field": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
} | Используйте поле | |
| Используйте поле |
Включение fielddata для полей text
Вы можете включить fielddata для существующего поля text с помощью API обновления сопоставления следующим образом:
resp = client.indices.put_mapping(
index="my-index-000001",
properties={
"my_field": {
"type": "text",
"fielddata": True
}
},
)
print(resp) response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
properties: {
my_field: {
type: 'text',
fielddata: true
}
}
}
)
puts response res, err := es.Indices.PutMapping(
[]string{"my-index-000001"},
strings.NewReader(`{
"properties": {
"my_field": {
"type": "text",
"fielddata": true
}
}
}`),
)
fmt.Println(res, err) const response = await client.indices.putMapping({
index: "my-index-000001",
properties: {
my_field: {
type: "text",
fielddata: true,
},
},
});
console.log(response); 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:
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"tag": {
"type": "text",
"fielddata": True,
"fielddata_frequency_filter": {
"min": 0.001,
"max": 0.1,
"min_segment_size": 500
}
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
tag: {
type: 'text',
fielddata: true,
fielddata_frequency_filter: {
min: 0.001,
max: 0.1,
min_segment_size: 500
}
}
}
}
}
)
puts response res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"tag": {
"type": "text",
"fielddata": true,
"fielddata_frequency_filter": {
"min": 0.001,
"max": 0.1,
"min_segment_size": 500
}
}
}
}
}`)),
)
fmt.Println(res, err) const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
tag: {
type: "text",
fielddata: true,
fielddata_frequency_filter: {
min: 0.001,
max: 0.1,
min_segment_size: 500,
},
},
},
},
});
console.log(response); 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, он не поддерживает сортировку и имеет только ограниченную поддержку агрегаций.
resp = client.indices.create(
index="logs",
mappings={
"properties": {
"@timestamp": {
"type": "date"
},
"message": {
"type": "match_only_text"
}
}
},
)
print(resp) response = client.indices.create(
index: 'logs',
body: {
mappings: {
properties: {
"@timestamp": {
type: 'date'
},
message: {
type: 'match_only_text'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "logs",
mappings: {
properties: {
"@timestamp": {
type: "date",
},
message: {
type: "match_only_text",
},
},
},
});
console.log(response); 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/8.17/text.html