新しいユーザーレコードをElasticSearchにアップアップし、ユーザーが既に存在する場合は情報を更新し、ユーザーのPaymentsアレイに新しいPaymentInfoオブジェクトを追加するスクリプトを作成しようとしています更新オブジェクトに格納されます。ここで私はこれまでのところで働いているかの簡易版です:ElasticSearchのアップサーピングと配列への追加
curl -XPOST 'http://localhost:9200/usrtest/usr/1/_update' -d '
{
"doc_as_upsert": true,
"doc": {
"customerId": "1",
"firstName": "Mark",
"lastName": "Z",
"emailAddress": "[email protected]",
"paymentInfo": {
"pid": "1",
"amt": "10"
}
}
}'
これはほとんど私は、ユーザーが同じIDで存在しているが、それはだ場合、それはドキュメントを適切にドキュメントを挿入、または更新することで何をしたいんユーザーが既に存在する場合は、このpaymentInfoをユーザーのpaymentInfos配列に追加するためのアスペクトがありません。今のように、それは単にpaymentInfoオブジェクトをオーバーライドします。
"script": "if (ctx._source.containsKey(\"paymentInfos\")) {ctx._source.paymentInfos += paymentInfo;} else {ctx._source.paymentInfos = paymentInfo}"
しかしelasticsearch script
要素が指定されている場合doc
要素を無視します:私は、更新JSONにこのスクリプトを追加しようとしました。
私はここで何か愚かなものを逃しているように感じますが、わかりません。誰かが私を助けることができますか?
編集:私はいくつかのスクリプトを実行するとき、それはpaymentInfoオブジェクトを追加することでもはほとんど私は、それをしたいん何
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": "[email protected]",
"paymentInfo": {
"pid": "1",
"amt": "10"
}
},
"params": {
"paymentInfo": {
"pid": "1",
"amt": "10"
}
}
}'
:私も次のことを試してみた それ以外の場合は、ドキュメント自体は更新されません(つまり、MarkをMindyに変更してスクリプトを再実行すると、upsert
要素はドキュメントがまだ存在しない場合にのみ使用されるため更新されません)。
https://discuss.elastic.co/t/append-to-existing-field/16423 –
文書全体を条件付きで更新できましたか?すなわち、スクリプトと文書を一緒に使用しますか?スクリプトとドキュメントを一緒に使用できないというエラーが表示されます。 – animageofmine