Семейство типов данных Keyword
Семейство keyword включает следующие типы полей:
-
keyword, который используется для структурированного контента, такого как идентификаторы, адреса электронной почты, имена хостов, коды состояния, почтовые индексы или теги. -
constant_keywordдля полей keyword, которые всегда содержат одно и то же значение. -
wildcardдля неструктурированного контента, сгенерированного машиной. Типwildcardоптимизирован для полей с большими значениями или высокой кардинальностью.
Поля keyword часто используются в сортировке, агрегациях и запросах на уровне терминов, таких как term.
Избегайте использования полей keyword для полнотекстового поиска. Используйте вместо этого тип поля text.
Тип поля Keyword
Ниже приведен пример отображения для базового поля keyword:
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"tags": {
"type": "keyword"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
tags: {
type: 'keyword'
}
}
}
}
)
puts response res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
}`)),
)
fmt.Println(res, err) const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
tags: {
type: "keyword",
},
},
},
});
console.log(response); PUT my-index-000001
{
"mappings": {
"properties": {
"tags": {
"type": "keyword"
}
}
}
} Отображение числовых идентификаторов
Не все числовые данные должны отображаться как тип данных поля числовой. Elasticsearch оптимизирует числовые поля, такие как integer или long, для range запросов. Однако поля keyword лучше подходят для term и других запросов на уровне терминов.
Идентификаторы, такие как ISBN или идентификатор продукта, редко используются в range запросах. Однако они часто извлекаются с помощью запросов на уровне терминов.
Рассмотрите отображение числового идентификатора как keyword, если:
- Вы не планируете искать данные идентификатора с помощью запросов
range. - Быстрое извлечение имеет значение.
termзапросы к полямkeywordчасто быстрее, чемtermзапросы к числовым полям.
Если вы не уверены, какой вариант использовать, можно использовать мультиполе для отображения данных как keyword и числового типа данных.
Параметры для базовых полей Keyword
Следующие параметры принимаются полями keyword:
-
doc_values - Необходимо ли хранить поле на диске в столбце, чтобы его можно было использовать для сортировки, агрегаций или скриптов? Принимает
true(по умолчанию) илиfalse. -
eager_global_ordinals - Необходимо ли загружать глобальные порядковые номера по запросу? Принимает
trueилиfalse(по умолчанию). Включение этого параметра рекомендуется для полей, которые часто используются в агрегациях по терминам. -
fields - Мультиполя позволяют одному и тому же строковому значению индексироваться различными способами для различных целей, например, одно поле для поиска и мультиполе для сортировки и агрегаций.
-
ignore_above - Не индексировать любые строки, длиннее этого значения. По умолчанию значение
2147483647, так что все значения будут приняты. Обратите внимание, однако, что правила динамического отображения по умолчанию создают подполеkeyword, которое переопределяет это значение по умолчанию, установивignore_above: 256. -
index - Должно ли поле быстро индексироваться? Принимает
true(по умолчанию) иfalse.keywordполя, которые имеют только включенную возможностьdoc_values, всё же могут быть запрошены, но медленнее. -
index_options - Какая информация должна храниться в индексе для целей оценки. По умолчанию
docs, но также может быть установлено значениеfreqs, чтобы учитывать частоту встречаемости термина при расчете оценок. -
meta - Метаданные о поле.
-
norms - Учитывать ли длину поля при оценке запросов. Принимает
trueилиfalse(по умолчанию). -
null_value - Принимает строковое значение, которое используется в качестве замены для явных
nullзначений. По умолчаниюnull, что означает, что поле считается отсутствующим. Обратите внимание, что это значение не может быть установлено, если используется значениеscript. -
on_script_error - Определяет, что делать, если скрипт, определенный параметром
script, генерирует ошибку при индексировании. Принимаетfail(по умолчанию), что приведет к отклонению всего документа, иcontinue, которое зарегистрирует поле в метаданных документа под полем_ignoredи продолжит индексирование. Этот параметр может быть задан только если задан параметрscript. -
script - Если этот параметр задан, поле будет индексировать значения, генерируемые этим скриптом, а не считывать значения непосредственно из источника. Если для этого поля в документе задано значение, документ будет отклонен с ошибкой. Скрипты имеют тот же формат, что и их аналоги runtime. Выводимые скриптом значения нормализуются как обычно и будут проигнорированы, если они длиннее значения, установленного в параметре
ignore_above. -
store - Хранить ли значение поля отдельно от поля
_source. Принимаетtrueилиfalse(по умолчанию). -
similarity - Какой алгоритм оценки или подобия использовать. По умолчанию
BM25. -
normalizer - Как предварительно обработать keyword перед индексированием. По умолчанию
null, что означает, что keyword сохраняется как есть. -
split_queries_on_whitespace - Разбивать ли полнотекстовые запросы входные данные на пробелы при построении запроса для этого поля. Принимает
trueилиfalse(по умолчанию). -
time_series_dimension -
(Необязательный, Булево)
Отмечает поле как размерность временного ряда. По умолчанию
false.Настройка индекса
index.mapping.dimension_fields.limitограничивает количество измерений в индексе.Поля измерений имеют следующие ограничения:
- Параметры отображения
doc_valuesиindexдолжны бытьtrue. -
Значения измерений используются для определения временного ряда документа. Если значения измерений изменяются каким-либо образом во время индексирования, документ будет храниться как принадлежащий другому временного ряду, чем ожидалось. В результате есть дополнительные ограничения:
- Поле не может использовать
normalizer.
- Поле не может использовать
- Параметры отображения
Синтетическое _source
Синтетическое _source доступно только для индексов TSDB (индексы, у которых index.mode установлено в time_series). Для других индексов синтетическое _source находится в техническом предварительном просмотре. Функции в техническом предварительном просмотре могут быть изменены или удалены в будущих выпусках. Elastic будет работать над устранением любых проблем, но функции в техническом предварительном просмотре не подпадают под SLA поддержки официальных функций GA.
Синтетический источник может сортировать поля keyword и удалять дубликаты. Например:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"kwd": {
"type": "keyword"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"kwd": [
"foo",
"foo",
"bar",
"baz"
]
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
kwd: {
type: "keyword",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
kwd: ["foo", "foo", "bar", "baz"],
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"kwd": { "type": "keyword" }
}
}
}
PUT idx/_doc/1
{
"kwd": ["foo", "foo", "bar", "baz"]
} Превратится в:
{
"kwd": ["bar", "baz", "foo"]
} Если поле keyword устанавливает store в true, то порядок и дубликаты сохраняются. Например:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"kwd": {
"type": "keyword",
"store": True
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"kwd": [
"foo",
"foo",
"bar",
"baz"
]
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
kwd: {
type: "keyword",
store: true,
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
kwd: ["foo", "foo", "bar", "baz"],
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"kwd": { "type": "keyword", "store": true }
}
}
}
PUT idx/_doc/1
{
"kwd": ["foo", "foo", "bar", "baz"]
} Превратится в:
{
"kwd": ["foo", "foo", "bar", "baz"]
} Значения, превышающие ignore_above, сохраняются, но сортируются в конец. Например:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"kwd": {
"type": "keyword",
"ignore_above": 3
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"kwd": [
"foo",
"foo",
"bang",
"bar",
"baz"
]
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
kwd: {
type: "keyword",
ignore_above: 3,
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
kwd: ["foo", "foo", "bang", "bar", "baz"],
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"kwd": { "type": "keyword", "ignore_above": 3 }
}
}
}
PUT idx/_doc/1
{
"kwd": ["foo", "foo", "bang", "bar", "baz"]
} Превратится в:
{
"kwd": ["bar", "baz", "foo", "bang"]
} Тип поля constant keyword
Тип constant keyword — это специализация поля keyword в случае, если все документы в индексе имеют одинаковое значение.
resp = client.indices.create(
index="logs-debug",
mappings={
"properties": {
"@timestamp": {
"type": "date"
},
"message": {
"type": "text"
},
"level": {
"type": "constant_keyword",
"value": "debug"
}
}
},
)
print(resp) response = client.indices.create(
index: 'logs-debug',
body: {
mappings: {
properties: {
"@timestamp": {
type: 'date'
},
message: {
type: 'text'
},
level: {
type: 'constant_keyword',
value: 'debug'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "logs-debug",
mappings: {
properties: {
"@timestamp": {
type: "date",
},
message: {
type: "text",
},
level: {
type: "constant_keyword",
value: "debug",
},
},
},
});
console.log(response); PUT logs-debug
{
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
},
"message": {
"type": "text"
},
"level": {
"type": "constant_keyword",
"value": "debug"
}
}
}
} constant_keyword поддерживает те же запросы и агрегации, что и поля keyword, но использует тот факт, что все документы имеют одинаковое значение в индексе, для более эффективного выполнения запросов.
Разрешается отправлять документы, у которых нет значения для поля или значение равно значению, настроенному в схеме. Два запроса индексирования ниже эквивалентны:
resp = client.index(
index="logs-debug",
document={
"date": "2019-12-12",
"message": "Starting up Elasticsearch",
"level": "debug"
},
)
print(resp)
resp1 = client.index(
index="logs-debug",
document={
"date": "2019-12-12",
"message": "Starting up Elasticsearch"
},
)
print(resp1) response = client.index(
index: 'logs-debug',
body: {
date: '2019-12-12',
message: 'Starting up Elasticsearch',
level: 'debug'
}
)
puts response
response = client.index(
index: 'logs-debug',
body: {
date: '2019-12-12',
message: 'Starting up Elasticsearch'
}
)
puts response const response = await client.index({
index: "logs-debug",
document: {
date: "2019-12-12",
message: "Starting up Elasticsearch",
level: "debug",
},
});
console.log(response);
const response1 = await client.index({
index: "logs-debug",
document: {
date: "2019-12-12",
message: "Starting up Elasticsearch",
},
});
console.log(response1); 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 поля изменить после его установки нельзя.
Параметры для полей constant keyword
Принимаются следующие параметры схемы:
| Метаданные о поле. | |
| | Значение, которое следует связать со всеми документами в индексе. Если этот параметр не задан, он устанавливается на основе первого индексированного документа. |
Тип поля wildcard
Тип поля wildcard — это специализированное поле keyword для неструктурированного машиногенерированного контента, который вы планируете искать с помощью запросов типа grep, таких как wildcard и regexp. Тип wildcard оптимизирован для полей с большими значениями или высокой кардинальностью.
Внутренне поле wildcard индексирует всё значение поля с помощью n-грамм и хранит полную строку. Индекс используется как грубый фильтр для сокращения количества значений, которые затем проверяются путём извлечения и проверки полных значений. Это поле особенно подходит для выполнения запросов типа grep над строками журналов. Стоимость хранения обычно ниже, чем у полей keyword, но скорость поиска точных совпадений по полным терминам медленнее. Если значения полей имеют много общих префиксов, например, URL-адреса одного и того же веб-сайта, стоимость хранения поля wildcard может быть выше, чем у эквивалентного поля keyword.
Вы индексируете и ищете в поле wildcard следующим образом
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"my_wildcard": {
"type": "wildcard"
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"my_wildcard": "This string can be quite lengthy"
},
)
print(resp1)
resp2 = client.search(
index="my-index-000001",
query={
"wildcard": {
"my_wildcard": {
"value": "*quite*lengthy"
}
}
},
)
print(resp2) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
my_wildcard: {
type: 'wildcard'
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
my_wildcard: 'This string can be quite lengthy'
}
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
query: {
wildcard: {
my_wildcard: {
value: '*quite*lengthy'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
my_wildcard: {
type: "wildcard",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
my_wildcard: "This string can be quite lengthy",
},
});
console.log(response1);
const response2 = await client.search({
index: "my-index-000001",
query: {
wildcard: {
my_wildcard: {
value: "*quite*lengthy",
},
},
},
});
console.log(response2); 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:
| Принимает строковое значение, которое используется как замена явных значений | |
| Не индексировать строки, длина которых превышает это значение. По умолчанию устанавливается |
Ограничения
- Поля
wildcardне токенизируются, как поля keyword, поэтому не поддерживают запросы, которые зависят от позиций слов, такие как запросы с фразами. - При выполнении запросов
wildcardлюбой параметрrewriteигнорируется. Оценка всегда является константной.
Синтетический _source
Синтетический источник может сортировать значения поля wildcard. Например:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"properties": {
"card": {
"type": "wildcard"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"card": [
"king",
"ace",
"ace",
"jack"
]
},
)
print(resp1) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
properties: {
card: {
type: "wildcard",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
card: ["king", "ace", "ace", "jack"],
},
});
console.log(response1); PUT idx
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"properties": {
"card": { "type": "wildcard" }
}
}
}
PUT idx/_doc/1
{
"card": ["king", "ace", "ace", "jack"]
} Превратится в:
{
"card": ["ace", "jack", "king"]
}
© 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/keyword.html