【发布时间】:2017-10-11 12:56:02
【问题描述】:
我想批量更新符合条件的文档。
ES 版本:5.1.1
索引:index_1234
类型:地址
网址: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”都得到了更新,即使是没有匹配字符串的文档。
提前致谢 !
更新:
非常感谢 Mike 的快速回复 :)
根据 Mike 字段检查,更新查询应更新如下。
"query": {
"exists": {
"field": "address"
}
}
但是还有 1 个问题。
最初,为了简单起见,我将字段保持在最低限度。
实际上有效载荷中有很多字段,我想根据某些条件更新其中的 3 个。
所以,payload如下
{
"id":12,
"address":"temp address",
"email":"temp email",
"phone":"temp phone",
.
.
.
}
我正在使用以下脚本来更新所有 3 个字段
{
"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'}"
}
}
我们可以为多个字段更新 Mike 的解决方案吗?或者有没有其他方法可以做到这一点? 再次感谢 !
【问题讨论】:
标签: elasticsearch elasticsearch-5