Elasticsearch updateByQuery返回200但未实际更新的问题
Elasticsearch Update By Query 不生效问题排查与解决
我现在用Elasticsearch JS客户端做操作,想找出所有attrs.tags等于XXX的文档,把这个字段的值清空。发送更新请求后返回了200状态码,Elasticsearch的响应显示已经更新了1条文档,但我再查询所有文档的时候,发现attrs.tags还是保留着旧值,哪怕等了5分钟让ES完成更新,结果还是没变。
相关代码
async function search() { var tag = req.body.tags; var client = connectToES(res); const response = await client.updateByQuery({ index: "*", type: '_doc', body: { "query": { "match": { "attrs.tags": tag } }, "script": { "inline": "ctx._source.attrs.tag = ''" } } }); client.close(); }
Elasticsearch响应内容
{"took":34,"timed_out":false,"total":1,"updated":1,"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":[]}
哎,一眼就瞅出问题所在了!你看脚本里写的是ctx._source.attrs.tag = '',但查询条件里匹配的是attrs.tags(复数形式),字段名写错了呀!
你要清空的是attrs.tags,但脚本里误写成了单数的tag,这相当于给文档新增了一个attrs.tag字段,原来的attrs.tags根本没被碰过,难怪查询时旧值还在呢!
修正后的代码
把脚本里的字段名改成正确的tags就行:
async function search() { var tag = req.body.tags; var client = connectToES(res); const response = await client.updateByQuery({ index: "*", type: '_doc', body: { "query": { "match": { "attrs.tags": tag } }, "script": { "inline": "ctx._source.attrs.tags = ''" } } }); client.close(); }
另外还有几个小细节可以优化下:
- 尽量别用
index: "*",会遍历所有索引,效率低还容易误操作,最好指定具体索引名 - 如果你的ES版本是7.x及以上,
type参数已经被弃用了,可以直接去掉 - 要是需求是彻底移除这个字段,也可以用
ctx._source.attrs.remove('tags')替代设为空字符串,按需选择就行
内容的提问来源于stack exchange,提问作者13Akaren
相关产品推荐
相关产品推荐

