2017-10-10 232 views
1

我想批量更新符合条件的文档。
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'}" 
    } 
} 

我们可以更新多个领域迈克的解决方案?或者有没有其他办法可以做到这一点? 再次感谢!

回答

2

发生这种情况的原因是,即使实际上并未修改您在_update_by_query请求中检索到的所有文档,它们至少在您的查询中被计入点击数。相反,在更新查询做你的域进行检查的

,添加此存在查询到您的更新请求:

"query": { 
    "exists": { 
    "field": "address" 
    } 
} 

编辑响应更新的问题:如果你想更新3场 ,你”最有可能最简单的时间就是通过单个脚本进行3次同时修改。如上所示,计数并不真正反映对文档进行的实际修改。如果计数是绝对需要的,你可以这样做(和它会过滤到具有这3个中的任何一个的任何文件)

"query": { 
    "bool": { 
    "minimum_should_match": 1, 
    "should": [ 
     { 
     "term": { 
      "address": { 
      "value": "temp address" 
      } 
     } 
     }, 
     { 
     "term": { 
      "email": { 
      "value": "temp email" 
      } 
     } 
     }, 
     { 
     "term": { 
     "phone": { 
      "value": "temp phone" 
     } 
     } 
    } 
    ] 
    } 
    } 
+0

嗨麦克,感谢非常快速反应:),我已经更新的问题现在,你可以看看“更新”部分。 ?? – SSG

+0

已添加回复您的更新问题@SSG – Miek

+0

谢谢迈克!但是我相信当且仅当所有3个条件匹配时,内联脚本才会执行,可能会出现只有1个或2个或全部3个条件匹配的情况。 – SSG

相关问题