Переопределение значений поля во время запроса
Если вы создаёте поле runtime с таким же именем, как поле, которое уже существует в схеме, поле runtime затеняет сопоставленное поле. Во время запроса Elasticsearch оценивает поле runtime, вычисляет значение на основе скрипта и возвращает значение в качестве части запроса. Поскольку поле runtime затеняет сопоставленное поле, вы можете переопределить возвращаемое значение в поиске, не изменяя сопоставленное поле.
Например, давайте предположим, что вы индексировали следующие документы в my-index-000001:
POST my-index-000001/_bulk?refresh=true
{"index":{}}
{"@timestamp":1516729294000,"model_number":"QVKC92Q","measures":{"voltage":5.2}}
{"index":{}}
{"@timestamp":1516642894000,"model_number":"QVKC92Q","measures":{"voltage":5.8}}
{"index":{}}
{"@timestamp":1516556494000,"model_number":"QVKC92Q","measures":{"voltage":5.1}}
{"index":{}}
{"@timestamp":1516470094000,"model_number":"QVKC92Q","measures":{"voltage":5.6}}
{"index":{}}
{"@timestamp":1516383694000,"model_number":"HG537PU","measures":{"voltage":4.2}}
{"index":{}}
{"@timestamp":1516297294000,"model_number":"HG537PU","measures":{"voltage":4.0}} Позже вы понимаете, что датчики HG537PU не сообщают о своём истинном напряжении. Индексированные значения должны быть в 1,7 раза больше, чем значения, сообщаемые датчиками! Вместо повторной индексации данных вы можете определить скрипт в разделе runtime_mappings запроса _search, чтобы затенить поле voltage и вычислить новое значение во время запроса.
Если вы ищете документы, где номер модели соответствует HG537PU:
GET my-index-000001/_search
{
"query": {
"match": {
"model_number": "HG537PU"
}
}
} Ответ включает индексированные значения для документов, соответствующих номеру модели HG537PU:
{
...
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0296195,
"hits" : [
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "F1BeSXYBg_szTodcYCmk",
"_score" : 1.0296195,
"_source" : {
"@timestamp" : 1516383694000,
"model_number" : "HG537PU",
"measures" : {
"voltage" : 4.2
}
}
},
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "l02aSXYBkpNf6QRDO62Q",
"_score" : 1.0296195,
"_source" : {
"@timestamp" : 1516297294000,
"model_number" : "HG537PU",
"measures" : {
"voltage" : 4.0
}
}
}
]
}
} Следующий запрос определяет поле runtime, где скрипт оценивает поле model_number, где значение равно HG537PU. Для каждой совпадающей записи скрипт умножает значение поля voltage на 1.7.
Используя параметр fields в API _search, вы можете получить значение, которое скрипт вычисляет для поля measures.voltage для документов, соответствующих запросу поиска:
POST my-index-000001/_search
{
"runtime_mappings": {
"measures.voltage": {
"type": "double",
"script": {
"source":
"""if (doc['model_number.keyword'].value.equals('HG537PU'))
{emit(1.7 * params._source['measures']['voltage']);}
else{emit(params._source['measures']['voltage']);}"""
}
}
},
"query": {
"match": {
"model_number": "HG537PU"
}
},
"fields": ["measures.voltage"]
} Глядя на ответ, вычисленные значения для measures.voltage для каждого результата являются 7.14 и 6.8. Вот это уже лучше! Поле runtime вычислило это значение в рамках запроса поиска, не изменяя сопоставленное значение, которое всё ещё возвращается в ответе:
{
...
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0296195,
"hits" : [
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "F1BeSXYBg_szTodcYCmk",
"_score" : 1.0296195,
"_source" : {
"@timestamp" : 1516383694000,
"model_number" : "HG537PU",
"measures" : {
"voltage" : 4.2
}
},
"fields" : {
"measures.voltage" : [
7.14
]
}
},
{
"_index" : "my-index-000001",
"_type" : "_doc",
"_id" : "l02aSXYBkpNf6QRDO62Q",
"_score" : 1.0296195,
"_source" : {
"@timestamp" : 1516297294000,
"model_number" : "HG537PU",
"measures" : {
"voltage" : 4.0
}
},
"fields" : {
"measures.voltage" : [
6.8
]
}
}
]
}
}
© 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-override-values.html