Elasticsearch结合express.js更新文档嵌套属性返回400问题求助
问题原因分析
- 脚本未遍历
items数组:原有写法直接访问ctx._source.items['items.key']不符合Painless语法,items是数组类型,必须循环遍历每个元素做匹配 - 错误使用
doc对象取值修改:doc是Elasticsearch用于查询阶段的字段访问对象,更新文档时必须直接操作ctx._source下的字段才能修改原始存储内容 - 赋值操作符错误:原脚本修改值用了
==比较符,实际赋值需要用= - 匹配精度问题:如果
code字段是需要精确匹配的业务字段,用term查询比match查询更准确,避免分词导致的匹配误差
修复后的完整代码
const input = { key: "XYZ", value: "1234" } this.axios.post( `/my-index-01/_update_by_query`, { script: { lang: 'painless', source: ` // 遍历items数组的每个元素 for (int i = 0; i < ctx._source.items.size(); i++) { // 匹配key相等的元素 if (ctx._source.items[i].key == params.key) { // 赋值修改对应的value ctx._source.items[i].value = params.value; // 如果只需要修改第一个匹配的元素,可打开下行注释终止循环 // break; } } `, params: input }, query: { // 精确匹配code字段,如果你确实需要模糊匹配可以改回match term: { "code.keyword": "ABC" // 如果code字段本身就是keyword类型,直接写"code": "ABC"即可 } } }, { headers: { "Content-Type": "application/json", }, } );
额外注意事项
- 如果
items字段是嵌套类型(nested),不需要调整上述脚本,Painless操作_source时嵌套类型和普通对象数组的操作方式一致 - 更新前可以先把
_update_by_query接口换成_search接口,验证query是否能正确命中你要修改的文档,避免误改数据
内容的提问来源于stack exchange,提问作者chebad
相关产品推荐
相关产品推荐

