新しいユーザー レコードを ElasticSearch にアップサートし、ユーザーが既に存在する場合は情報を更新し、更新オブジェクトに存在する場合はユーザーの Payments 配列に新しい PaymentInfo オブジェクトを追加するスクリプトを作成しようとしています。ここに私がこれまでに取り組んでいるものの簡略化されたバージョンがあります:
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}"
ただし、要素が指定されている場合、elasticsearch はdoc
要素を無視し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
ドキュメントがまだ存在しない場合にのみ要素が使用されるため、更新されません)。