2013-08-03 2 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}" 

을하지만 script 요소가 지정 될 때 elasticsearch는 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]}" 

첫 번째 섹션의 'paymentInfos'속성이 객체로 정의되어 사용자가 넘어 질 수 있습니다.

+2

이 답변은 유효합니까? 만약 그렇다면 @Seven Helix가 투표 해주십시오. – JohnnyM

+1

잘 작동했습니다 – Leabdalla

+0

Groovy를 사용하면 어떻게됩니까? – cwarny