2016-03-30 10 views
2

Gibt es eine Möglichkeit, Term in ein Array von Werten anzuhängen?Elasticsearch - wie man Begriff anfügt?

Zum Beispiel, wenn mein Dokument sieht wie folgt aus:

{ 
    "items": ["item1", "item2", "item3"] 
} 

ich will „item4“ und „item5“, um es anzuhängen.

Ich muss es in 2 Abfragen tun? eine, um die aktuelle Liste von Werten zu laden, und um diese Liste zu aktualisieren? Oder gibt es eine elegantere Methode, die es mir erlaubt, diese Elemente in einer Abfrage anzuhängen?

Ich versuche es mit elastic4s wie diesem zu tun:

client.execute(ElasticDsl.update id id in indexName/documentType script { 
    script(s"ctx._source.items += tag").params(Map("tag"->"item4")) 
}) 

Um den oben genannten Code-Schnipsel zu verwenden, muß ich groovy Skripte ermöglichen, und ich bin nicht sicher, wie es mit mehr Artikeln zu tun .

Irgendeine Idee?

+1

einfache Weise tun es mit zwei Abfragen nützlich sein. Aber Sie können benutzerdefinierte Skripts verwenden [1] (http://stackoverflow.com/questions/18028280/elasticsearch-upserting-and-appending-to-array), [2] (http://stackoverflow.com/questions/31142729/append-to-a-elasticsearch-Feld-Liste-Array-wenn-es-nicht-ein-vorhanden-Element), um es mit einer Abfrage zu tun. – pkhlop

+0

@pkhlop Danke. Was ist mit mehreren Artikeln? wie kann ich das machen? – Tomer

Antwort

4

Hier ist ein vollständiges Beispiel, wie Sie dies erreichen können.

Merge neue Werte-Array und machen es einzigartig nach:

DELETE test/test/1 

POST test/test/1 
{ 
    "terms":["item1", "item2", "item3"] 
} 

GET test/test/1 

POST test/test/1/_update 
{ 
    "script" : " ctx._source.terms << newItems; ctx._source.terms = ctx._source.terms.flatten().unique()", 
    "params" : { 
     "newItems" : ["a","b"] 
    } 
} 

stellen Sie sicher, Sie haben scripting in Serverkonfiguration aktiviert

user:/etc/elasticsearch# head elasticsearch.yml 
script.inline: true 
script.indexed: true 
... 
+1

Beim Versuch bekomme ich eine Ausnahme: "Grund": "Keine solche Eigenschaft: ctx für Klasse: 73fa07c80e9d5eb75065 keine Idee? – Tomer

+1

siehe Update in Antwort, müssen Sie Inline-Scripting aktivieren – pkhlop

+0

Danke .. es geschafft, dies durch Hinzufügen von groovy Abhängigkeit zu beheben zu meiner build.sbt, die Abfrage hat funktioniert, aber das Ergebnis war nicht wie erwartet .. :(Ich habe- "Begriffe": ["item1", "item2", "item3", ["item4", "item5"] .?] Jede Art und Weise, dies zu beheben – Tomer

Verwandte Themen