elasticsearch:使用脚本更新嵌套字段?

我想在nested每个更新时间将一个对象添加到字段中。

例如,我有一个文档:

{

"test":[{"remark":"remark1"}]

}

下次,我想在remark测试字段中添加一个对象并保存旧remark对象。结果是:

{

"test":[{"remark":"remark1"},{"remark":"remark2"}]

}

如何实现?

我使用脚本:

{

"script": "ctx._source.test= ((ctx._source.test?: []) += remarkItem)",

"params": {

"remarkItem": {

"remark": "addd"

}

}

}

但是,我得到了例外:

{

"error": {

"root_cause": [

{

"type": "remote_transport_exception",

"reason": "[es77][10.14.84.77:9300][indices:data/write/update[s]]"

}

],

"type": "illegal_argument_exception",

"reason": "failed to execute script",

"caused_by": {

"type": "script_exception",

"reason": "Failed to compile inline script [ctx._source.test= ((ctx._source.test?: []) += remarkItem)] using lang [groovy]",

"caused_by": {

"type": "script_exception",

"reason": "failed to compile groovy script",

"caused_by": {

"type": "multiple_compilation_errors_exception",

"reason": "startup failed:\na8220b2cf14b8b7ebeead7f068416882d04fa25d: 1: \nclass org.codehaus.groovy.ast.expr.ElvisOperatorExpression, with its value '(ctx._source.test) ? ctx._source.test: []', is a bad expression as the left hand side of an assignment operator at line: 1 column: 82. File: a8220b2cf14b8b7ebeead7f068416882d04fa25d @ line 1, column 82.\n CILastCallResultRemark ?: []) += remarkI\n ^\n\n1 error\n"

}

}

}

},

"status": 400

}

现在,我想添加一个字段以确保更新或插入对象。例如:

{

"test":[{"remark":"remark1","id":"1"}]

}

当我更新字段时,当id存在时,我将更新对象。相反,我将插入对象。

回答:

我建议尝试这样的脚本,该脚本在参数中带有两个参数。它将检查任何嵌套对象是否已经包含给定的id:

  • 如果是,它将更新给定 remark
  • 如果没有,它将在test数组中插入一个新的嵌套对象。

脚本如下所示:

def updated = false

ctx._source.test?.each { obj ->

if (obj.id == item.id) {

obj.remark = item.remark

updated = true

}

}

if (!updated) {

ctx._source.test = ((ctx._source.test ?: []) + item)

}

内联并使用适当的分号后,脚本如下所示:

{

"script": "def updated = false; ctx._source.test?.each { obj -> if (obj.id == item.id) { obj.remark = item.remark; updated = true } }; if (!updated) { ctx._source.test = ((ctx._source.test ?: []) + item)}",

"params": {

"item": {

"remark": "addd",

"id": "1"

}

}

}

以上是 elasticsearch:使用脚本更新嵌套字段? 的全部内容, 来源链接: utcz.com/qa/426761.html

回到顶部