Я хочу массово обновить документы, соответствующие критериям.
Версия ES: 5.1.1
Индекс: index_1234
Тип: адреса
URL: POST http://localhost:9200/index_1234/addresses/_update_by_query
Полезная нагрузка:
{
"id":1,
"address":"temp address"
}
Я использую следующий встроенный скрипт для обновления документов
{
"script": {
"inline": "if(ctx._source.containsKey(\"address\") && ctx._source.address == "temp address"){ctx._source.address='perm address'}"
}
}
т.е. если поле «адрес» имеет значение «временный адрес», я заменяю его «постоянным адресом».
Этот скрипт работает отлично и обновляет только соответствующие документы. Однако у меня есть сомнения
Предположим, что всего 10 документов, из которых 5 имеют поле «адрес» как «временный адрес» и 5 имеют поле «адрес» как «постоянный адрес».
При выполнении вышеуказанного скрипта он дает следующее o/p
{
"took": 131,
"timed_out": false,
"total": 10,
**"updated": 10**,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
поэтому, хотя он обновил только 5 документов (я дважды проверил), в окончательном ответе написано «обновлено»: 10. Я ожидал «обновлено»: 5, я что-то упустил? он что-то еще обновляет? Я вижу, что "_version" обновляется для всех документов, то есть даже для документов, у которых нет совпадающей строки.
Заранее спасибо!
ОБНОВЛЕНИЕ:
Большое спасибо, Майк, за быстрый ответ :)
По словам Майка, проверка поля в запросе на обновление должна быть обновлена следующим образом.
"query": {
"exists": {
"field": "address"
}
}
Однако есть еще 1 проблема.
Изначально я свел поля к минимуму для простоты вопроса. На самом деле в полезной нагрузке много полей, и я хочу обновить 3 из них на основе некоторого условия.
Итак, полезная нагрузка выглядит следующим образом
{
"id":12,
"address":"temp address",
"email":"temp email",
"phone":"temp phone",
.
.
.
}
И я использую следующий скрипт для обновления всех трех полей.
{
"script": {
"inline": "if(ctx._source.containsKey(\"address\") && ctx._source.address == "temp address"){ctx._source.address='perm address'}if(ctx._source.containsKey(\"email\") && ctx._source.email == "temp email"){ctx._source.email='perm email'}if(ctx._source.containsKey(\"phone\") && ctx._source.phone == "temp phone"){ctx._source.phone='perm phone'}"
}
}
мы можем обновить решение Майка для нескольких полей ?? или есть ли альтернативный способ сделать это? Спасибо еще раз !