Elasticsearch向上插入并追加到数组

我正在尝试编写一个脚本,该脚本会将新的用户记录追加到ElasticSearch,如果该用户已经存在,则更新任何信息,如果新对象中存在更新的PaymentInfo对象,则将其添加到用户的Payments数组中。这是到目前为止我正在使用的简化版本:

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '

{

"doc_as_upsert": true,

"doc": {

"customerId": "1",

"firstName": "Mark",

"lastName": "Z",

"emailAddress": "foo.bar@gmail.com",

"paymentInfo": {

"pid": "1",

"amt": "10"

}

}

}'

这几乎可以满足我的要求,因为它可以正确地插入文档,或者如果用户具有相同的ID,则可以更新文档,但是如果该用户已经存在,则缺少将这个PaymentInfo添加到用户的paymentInfos数组中的方面。目前,它只是覆盖了PaymentInfo对象。我尝试将此脚本添加到更新JSON:

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}"

但是docscript指定元素时,elasticsearch会忽略元素。

我觉得我在这里想念一些愚蠢的东西,但不确定。这里有人可以帮我吗?

我也尝试了以下方法:

curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '

{

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}",

"upsert": {

"customerId": "1",

"firstName": "Mark",

"lastName": "Z",

"emailAddress": "foo.bar@gmail.com",

"paymentInfo": {

"pid": "1",

"amt": "10"

}

},

"params": {

"paymentInfo": {

"pid": "1",

"amt": "10"

}

}

}'

几乎达到

了我想要的目的,因为当我多次运行脚本时,它会添加paymentInfo对象,但是否则它不会更新文档本身(即,如果我再次运行脚本,将Mark更改为Mindy,它将不会更新,因为upsert仅在文档尚不存在时才使用元素)。

回答:

您需要在脚本的插入部分添加一些数组括号。

"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = [paymentInfo]}"

第一部分中的’paymentInfos’属性定义为一个对象,因此也可能导致您摔倒。

以上是 Elasticsearch向上插入并追加到数组 的全部内容, 来源链接: utcz.com/qa/415158.html

回到顶部