2013-08-03 12 views
23

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

+0

https://discuss.elastic.co/t/append-to-existing-field/16423 –

+0

文書全体を条件付きで更新できましたか?すなわち、スクリプトと文書を一緒に使用しますか?スクリプトとドキュメントを一緒に使用できないというエラーが表示されます。 – animageofmine

答えて

24

スクリプトの挿入部分にいくつかの括弧を追加するとよいでしょう。

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

第1セクションの 'paymentInfos'プロパティがオブジェクトとして定義されているため、あなたも落ちる可能性があります。

+2

この回答は有効ですか?もしそうなら@Section Helixはそれを投票してください。 – JohnnyM

+1

これは私のためにうまくいきました – Leabdalla

+0

Groovyでどうやったら同じでしょうか? – cwarny

関連する問題