我想批量更新符合条件的文档。
ES版本:5.1.1
指数:index_1234
类型:地址
网址:POST http://localhost:9200/index_1234/addresses/_update_by_query
有效载荷:更新符合特定条件的ElasticSearch文档
{
"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”得到更新,即使对于没有匹配字符串的文档也是如此。
在此先感谢!
UPDATE:
感谢更新查询快速反应:)
据迈克现场检查了不少麦克应更新如下。
"query": {
"exists": {
"field": "address"
}
}
但是还有1个问题。
最初,为了简化问题,我将场地保持在最小。 实际上,有效载荷中有很多字段,我想根据某些条件更新其中的3个字段。
因此,有效载荷为如下
{
"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'}"
}
}
我们可以更新多个领域迈克的解决方案?或者有没有其他办法可以做到这一点? 再次感谢!
嗨麦克,感谢非常快速反应:),我已经更新的问题现在,你可以看看“更新”部分。 ?? – SSG
已添加回复您的更新问题@SSG – Miek
谢谢迈克!但是我相信当且仅当所有3个条件匹配时,内联脚本才会执行,可能会出现只有1个或2个或全部3个条件匹配的情况。 – SSG