2013-08-03 57 views
23

我想寫一個腳本,將插入一個新的用戶記錄到ElasticSearch,更新任何信息,如果用戶已經存在,並且附加一個新的PaymentInfo對象到用戶的Payments數組中在更新對象中。這裏就是我有這麼遠工作的簡化版本: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對象。我試着將這個腳本來更新JSON:

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

,但指定的script元素時elasticsearch忽略doc元素。

我覺得我在這裏錯過了一些愚蠢的東西,但我不確定。有人可以幫我嗎?

編輯: 我試過下面還有:

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" 
     } 
    } 
}' 

其中也幾乎做什麼,我希望它,因爲它,當我運行該腳本幾個追加paymentInfo對象但不會更新文檔本身(即,如果我再次運行腳本,將標記更改爲Mindy,則它不會更新,因爲upsert元素僅在文檔不存在的情況下才會使用)。

+0

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

+0

您是否可以使用條件更新整個文檔? eg.g一起使用腳本和文檔?我收到一個腳本和doc不能一起使用的錯誤。 – animageofmine

回答

24

你會想添加一些數組括號到腳本的插入部分。

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

在第一部分中的「paymentInfos」屬性被定義爲一個對象,以便也可能是導致你落下。

+2

這個答案有效嗎?如果是這樣@第七螺旋請投它。 – JohnnyM

+1

這對我來說工作得很好 – Leabdalla

+0

Groovy如何做到這一點? – cwarny