我正在尝试编写一个脚本,将新的用户记录更新到 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}"
doc
但是当指定元素时, elasticsearch 会忽略元素script
。
我觉得我在这里错过了一些愚蠢的东西,但我不确定。这里有人可以帮我吗?
编辑: 我也尝试过以下方法:
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
元素仅在文档不存在时使用)。