Индексирование поля выполнения
Поля выполнения определяются контекстом, в котором они выполняются. Например, вы можете определить поля выполнения в контексте запроса поиска или в разделе runtime отображения индекса. Если вы решите индексировать поле выполнения для повышения производительности, просто перенесите полное определение поля выполнения (включая скрипт) в контекст отображения индекса. Elasticsearch автоматически использует эти индексированные поля для обработки запросов, что приводит к быстрому времени отклика. Эта возможность означает, что вы можете написать скрипт только один раз и применить его к любому контексту, поддерживающему поля выполнения.
Индексирование composite поля выполнения в настоящее время не поддерживается.
Затем вы можете использовать поля выполнения, чтобы ограничить количество полей, для которых Elasticsearch необходимо вычислять значения. Использование индексированных полей совместно с полями выполнения обеспечивает гибкость в данных, которые вы индексируете, и в том, как вы определяете запросы для других полей.
После индексирования поля выполнения вы не можете обновить включённый скрипт. Если вам нужно изменить скрипт, создайте новое поле с обновлённым скриптом.
Например, предположим, что ваша компания хочет заменить некоторые старые предохранительные клапаны. Подключенные датчики способны сообщать только часть истинных показаний. Вместо того, чтобы оснастить предохранительные клапаны новыми датчиками, вы решаете рассчитать значения на основе сообщённых показаний. На основании сообщённых данных вы определяете следующие поля в отображении для my-index-000001:
PUT my-index-000001/
{
"mappings": {
"properties": {
"timestamp": {
"type": "date"
},
"temperature": {
"type": "long"
},
"voltage": {
"type": "double"
},
"node": {
"type": "keyword"
}
}
}
} Затем вы выполняете массовую индексацию некоторых образцов данных с ваших датчиков. Эти данные включают voltage показания для каждого датчика:
POST my-index-000001/_bulk?refresh=true
{"index":{}}
{"timestamp": 1516729294000, "temperature": 200, "voltage": 5.2, "node": "a"}
{"index":{}}
{"timestamp": 1516642894000, "temperature": 201, "voltage": 5.8, "node": "b"}
{"index":{}}
{"timestamp": 1516556494000, "temperature": 202, "voltage": 5.1, "node": "a"}
{"index":{}}
{"timestamp": 1516470094000, "temperature": 198, "voltage": 5.6, "node": "b"}
{"index":{}}
{"timestamp": 1516383694000, "temperature": 200, "voltage": 4.2, "node": "c"}
{"index":{}}
{"timestamp": 1516297294000, "temperature": 202, "voltage": 4.0, "node": "c"} После разговора с несколькими инженерами по обслуживанию вы понимаете, что датчики должны сообщать, по крайней мере, в два раза больше текущих значений, но потенциально больше. Вы создаёте поле выполнения с именем voltage_corrected, которое извлекает текущее напряжение и умножает его на 2:
PUT my-index-000001/_mapping
{
"runtime": {
"voltage_corrected": {
"type": "double",
"script": {
"source": """
emit(doc['voltage'].value * params['multiplier'])
""",
"params": {
"multiplier": 2
}
}
}
}
} Вы получаете рассчитанные значения, используя параметр fields на _search API:
GET my-index-000001/_search
{
"fields": [
"voltage_corrected",
"node"
],
"size": 2
} После анализа данных датчиков и проведения некоторых тестов вы определяете, что множитель для сообщённых данных датчика должен составлять 4. Для повышения производительности вы решаете индексировать voltage_corrected поле выполнения с новым параметром multiplier.
В новом индексе с именем my-index-000001 скопируйте определение поля выполнения voltage_corrected в отображение нового индекса. Всё так просто! Вы можете добавить необязательный параметр с именем on_script_error, который определяет, следует ли отклонить весь документ, если скрипт выдаст ошибку во время индексирования (по умолчанию).
PUT my-index-000001/
{
"mappings": {
"properties": {
"timestamp": {
"type": "date"
},
"temperature": {
"type": "long"
},
"voltage": {
"type": "double"
},
"node": {
"type": "keyword"
},
"voltage_corrected": {
"type": "double",
"on_script_error": "fail",
"script": {
"source": """
emit(doc['voltage'].value * params['multiplier'])
""",
"params": {
"multiplier": 4
}
}
}
}
}
} | Приводит к отклонению всего документа, если скрипт выдаёт ошибку во время индексирования. Установка значения в |
Выполните массовую индексацию некоторых образцов данных с ваших датчиков в индекс my-index-000001:
POST my-index-000001/_bulk?refresh=true
{ "index": {}}
{ "timestamp": 1516729294000, "temperature": 200, "voltage": 5.2, "node": "a"}
{ "index": {}}
{ "timestamp": 1516642894000, "temperature": 201, "voltage": 5.8, "node": "b"}
{ "index": {}}
{ "timestamp": 1516556494000, "temperature": 202, "voltage": 5.1, "node": "a"}
{ "index": {}}
{ "timestamp": 1516470094000, "temperature": 198, "voltage": 5.6, "node": "b"}
{ "index": {}}
{ "timestamp": 1516383694000, "temperature": 200, "voltage": 4.2, "node": "c"}
{ "index": {}}
{ "timestamp": 1516297294000, "temperature": 202, "voltage": 4.0, "node": "c"} Теперь вы можете получить рассчитанные значения в запросе поиска и найти документы на основе точных значений. Следующий запрос диапазона возвращает все документы, где рассчитанное voltage_corrected больше или равно 16, но меньше или равно 20. Опять же, используйте параметр fields на _search API для получения необходимых полей:
POST my-index-000001/_search
{
"query": {
"range": {
"voltage_corrected": {
"gte": 16,
"lte": 20,
"boost": 1.0
}
}
},
"fields": [
"voltage_corrected", "node"]
} Ответ включает поле voltage_corrected для документов, соответствующих запросу диапазона, на основе рассчитанного значения включённого скрипта:
{
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "yoSLrHgBdg9xpPrUZz_P",
"_score" : 1.0,
"_source" : {
"timestamp" : 1516383694000,
"temperature" : 200,
"voltage" : 4.2,
"node" : "c"
},
"fields" : {
"voltage_corrected" : [
16.8
],
"node" : [
"c"
]
}
},
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "y4SLrHgBdg9xpPrUZz_P",
"_score" : 1.0,
"_source" : {
"timestamp" : 1516297294000,
"temperature" : 202,
"voltage" : 4.0,
"node" : "c"
},
"fields" : {
"voltage_corrected" : [
16.0
],
"node" : [
"c"
]
}
}
]
}
}
© 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/runtime-indexed.html