如何在更新Elasticsearch时追加嵌套对象?附查询示例
你的Elasticsearch更新脚本无法实现预期需求,原因及修正方案如下
嘿,我来帮你拆解这个问题~首先直接给结论:你写的这个更新查询不能实现嵌套对象的追加操作,而且执行时会直接报错,原因很简单:
问题出在哪?
你的目标文档里,stats是一个键值对对象:
"stats": { "likes": 40, "comments": 50 }
但你在脚本里调用了add()方法——这个方法是Elasticsearch Painless脚本里给数组用的,对象(LinkedHashMap类型)根本没有这个方法,执行时会抛出类似No such method [add] on object of type [java.util.LinkedHashMap]的错误。
针对不同需求的修正方案
得先明确你说的“嵌套对象的追加”具体是哪种场景,对应不同的脚本写法:
场景1:给现有stats里的字段累加数值(比如把likes从40加到41)
如果是想给已有的likes字段加1,脚本应该直接操作字段值:
POST feed/feed/41/_update { "script": { "source" : "ctx._source.stats.likes += params.abc.likes", "params": { "abc": { "likes": 1 } }, "lang": "painless" } }
更简洁的写法也可以直接自增:
POST feed/feed/41/_update { "script": { "source" : "ctx._source.stats.likes++", "lang": "painless" } }
场景2:给stats对象追加新的属性(比如新增shares字段)
如果是想给stats对象添加新的键值对,比如加一个shares字段,要用putAll()方法把参数里的对象合并进去:
POST feed/feed/41/_update { "script": { "source" : "ctx._source.stats.putAll(params.abc)", "params": { "abc": { "shares": 20 } }, "lang": "painless" } }
执行后你的stats就会变成:
"stats": { "likes": 40, "comments": 50, "shares": 20 }
内容的提问来源于stack exchange,提问作者user8590996
相关产品推荐
相关产品推荐

