我想寫一個腳本,將插入一個新的用戶記錄到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
元素僅在文檔不存在的情況下才會使用)。
https://discuss.elastic.co/t/append-to-existing-field/16423 –
您是否可以使用條件更新整個文檔? eg.g一起使用腳本和文檔?我收到一個腳本和doc不能一起使用的錯誤。 – animageofmine