Отображение поля в реальном времени
Поля в реальном времени отображаются путем добавления раздела runtime под определением отображения и определения скрипта Painless. Этот скрипт имеет доступ ко всему контексту документа, включая исходное _source через params._source и любые отображенные поля и их значения. Во время запроса скрипт выполняется и генерирует значения для каждого требуемого для запроса поля со скриптом.
Например, скрипт в следующем запросе вычисляет день недели из поля @timestamp, которое определено как тип date. Скрипт вычисляет день недели на основе значения timestamp и использует emit для возвращения рассчитанного значения.
resp = client.indices.create(
index="my-index-000001",
mappings={
"runtime": {
"day_of_week": {
"type": "keyword",
"script": {
"source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
}
}
},
"properties": {
"@timestamp": {
"type": "date"
}
}
},
)
print(resp) const response = await client.indices.create({
index: "my-index-000001",
mappings: {
runtime: {
day_of_week: {
type: "keyword",
script: {
source:
"emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))",
},
},
},
properties: {
"@timestamp": {
type: "date",
},
},
},
});
console.log(response); PUT my-index-000001/
{
"mappings": {
"runtime": {
"day_of_week": {
"type": "keyword",
"script": {
"source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ENGLISH))"
}
}
},
"properties": {
"@timestamp": {"type": "date"}
}
}
} Раздел runtime может быть любого из этих типов данных:
-
boolean -
composite -
date -
double -
geo_point -
ip -
keyword -
long -
lookup
Поля в реальном времени с типом type date могут принимать параметр format точно так же, как и поле типа date.
Поля в реальном времени с типом type lookup позволяют извлекать поля из связанных индексов. См. retrieve fields from related indices.
Если динамическое отображение полей включено, где параметр dynamic установлен в значение runtime, новые поля автоматически добавляются в отображение индекса как поля в реальном времени:
resp = client.indices.create(
index="my-index-000001",
mappings={
"dynamic": "runtime",
"properties": {
"@timestamp": {
"type": "date"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
dynamic: 'runtime',
properties: {
"@timestamp": {
type: 'date'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
dynamic: "runtime",
properties: {
"@timestamp": {
type: "date",
},
},
},
});
console.log(response); PUT my-index-000001
{
"mappings": {
"dynamic": "runtime",
"properties": {
"@timestamp": {
"type": "date"
}
}
}
} Определение полей в реальном времени без скрипта
Поля в реальном времени обычно включают скрипт Painless, который каким-либо образом изменяет данные. Однако существуют случаи, когда вы можете определить поле в реальном времени без скрипта. Например, если вы хотите извлечь одно поле из _source без внесения изменений, вам не нужен скрипт. Вы можете просто создать поле в реальном времени без скрипта, например, day_of_week:
resp = client.indices.create(
index="my-index-000001",
mappings={
"runtime": {
"day_of_week": {
"type": "keyword"
}
}
},
)
print(resp) response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
runtime: {
day_of_week: {
type: 'keyword'
}
}
}
}
)
puts response const response = await client.indices.create({
index: "my-index-000001",
mappings: {
runtime: {
day_of_week: {
type: "keyword",
},
},
},
});
console.log(response); PUT my-index-000001/
{
"mappings": {
"runtime": {
"day_of_week": {
"type": "keyword"
}
}
}
} Если скрипт не указан, Elasticsearch неявно ищет в _source во время запроса поле с тем же именем, что и поле в реальном времени, и возвращает значение, если оно существует. Если поле с тем же именем не существует, ответ не содержит значений для этого поля в реальном времени.
В большинстве случаев извлекайте значения полей через doc_values всякий раз, когда это возможно. Доступ к doc_values с помощью поля в реальном времени быстрее, чем извлечение значений из _source из-за способа загрузки данных из Lucene.
Однако есть случаи, когда необходимо извлекать поля из _source. Например, поля text по умолчанию не имеют doc_values, поэтому вам нужно извлекать значения из _source. В других случаях вы можете отключить doc_values для определенного поля.
В качестве альтернативы можно добавить префикс к полю, для которого необходимо получить значения (например, params._source.day_of_week). Для простоты рекомендуется определять поле в реальном времени в определении отображения без скрипта, когда это возможно.
Игнорирование ошибок скрипта для полей в реальном времени
Скрипты могут генерировать ошибки во время выполнения, например, при обращении к отсутствующим или неверным значениям в документах или при выполнении недопустимых операций. Параметр on_script_error можно использовать для управления поведением при возникновении таких ошибок. Установка этого параметра в значение continue приведет к тому, что все ошибки этого поля в реальном времени будут молча игнорироваться. Значение параметра по умолчанию fail вызовет сбой фрагмента, о котором сообщается в ответ на поиск.
Обновление и удаление полей в реальном времени
Поля в реальном времени можно обновлять или удалять в любое время. Чтобы заменить существующее поле в реальном времени, добавьте новое поле в реальном времени в отображения с тем же именем. Чтобы удалить поле в реальном времени из отображений, установите значение поля в реальном времени в null:
resp = client.indices.put_mapping(
index="my-index-000001",
runtime={
"day_of_week": None
},
)
print(resp) response = client.indices.put_mapping(
index: 'my-index-000001',
body: {
runtime: {
day_of_week: nil
}
}
)
puts response const response = await client.indices.putMapping({
index: "my-index-000001",
runtime: {
day_of_week: null,
},
});
console.log(response); PUT my-index-000001/_mapping
{
"runtime": {
"day_of_week": null
}
}
© 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/runtime-mapping-fields.html