28

新しいユーザー レコードを 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ドキュメントがまだ存在しない場合にのみ要素が使用されるため、更新されません)。

4

1 に答える 1