2013-08-03 8 views
23

Próbuję napisać skrypt, który wstawi nowy rekord użytkownika do ElasticSearch, aktualizując wszelkie informacje, jeśli użytkownik już istnieje, i dołączając nowy obiekt PaymentInfo do tablicy Payments użytkownika, jeśli istnieje w obiekcie aktualizacji. Oto uproszczona wersja tego, co ja pracuję do tej pory:Elasticsearch upserting and appending to array

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

To prawie robi to, co chcę w to, że wstawia doc prawidłowo lub aktualizuje doc jeśli użytkownik istnieje z tego samego identyfikatora, ale to brakuje aspektu, aby dodać tę informację paymentInfo do tablicy paymentInfos użytkownika, jeśli użytkownik już istnieje. Tak jak teraz, po prostu przesłania obiekt paymentInfo. Próbowałem dodanie tego skryptu do JSON aktualizacja:

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

ale elasticsearch ignoruje doc elementy, gdy element script jest określona.

Czuję, że brakuje mi tutaj czegoś głupiego, ale nie jestem pewien. Czy ktoś może mi pomóc?

Edit: Próbowałem następujące także:

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

który również prawie ma co chcę go w to, że dołącza obiekty paymentInfo kiedy uruchomić skrypt kilka razy, ale poza tym nie aktualizuje samego dokumentu (tzn. jeśli ponownie uruchomię skrypt, zmieniając Mark na Mindy, to nie aktualizuje się, ponieważ elementy są używane tylko wtedy, gdy dokument już nie istnieje).

+0

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

+0

Czy byłeś w stanie zaktualizować cały dokument z warunkiem? np. użyć skryptu i dokumentu razem? Wystąpił błąd, że skryptu i dokumentu nie można używać łącznie. – animageofmine

Odpowiedz

24

będziesz chciał dodać kilka nawiasów tablicowych do części wstawiania skryptu.

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

Właściwość "paymentInfos" w pierwszej sekcji jest zdefiniowana jako obiekt, więc może również powodować upadek.

+2

czy ta odpowiedź jest ważna? jeśli tak, to trzydziestka Helix, zagłosujcie. – JohnnyM

+1

to działało dobrze dla mnie – Leabdalla

+0

Jak zrobiłbyś to samo z Groovy? – cwarny