2016-03-21 20 views
0

Wie füge ich ein String-Array zu einem vorhandenen String-Array-Feld in Elasticsearch mit Hilfe von Skript?Hinzugefügt einzigartige Werte von Array zu Array in ElasticSearch

Das Ergebnis-String-Array in Elasticsearch darf nur eindeutige String-Elemente enthalten.

Ich weiß, wie man einen Wert in String-Array hinzuzufügen:

x = "test" 
client.update index:'test', type:'test', id:'1', body:{script:"if (!ctx._source.a.contains(x)) {ctx._source.a += x;}", params:{x: x}} 

Ich brauche den gleichen Code für String-Array

x = ["test1", "test2"] 

Antwort

0

Sie können einfach alle Elemente verketten und dann die einzigartigen Elemente finden als unten.

{ 
     script:"ctx._source.a += x; ctx._source.a = ctx._source.a.uniq;", 
     params:{x: x} 
    } 

Die uniq method entfernt alle doppelten Elemente und behält alle einzigartige Elemente im Array.

+0

habe ich versucht, diesen Code auszuführen. Fehler: > {"script": "ctx._source.a + = x; ctx._source.a.uniq", "params": {"x": ["1", "2", "3", "111", "222", "333"]}} <{"error": "ElasticsearchIllegalArgumentException [Script konnte nicht ausgeführt werden]; geschachtelt: GroovyScriptExecutionException [MissingPropertyException [Exception evaluating property 'uniq' für java.util.ArrayList, Reason : groovy.lang.MissingPropertyException: Keine solche Eigenschaft: uniq für Klasse: java.lang.String]]; "," status ": 400} –

+0

Da das Sprachtag in Ihrer Frage ruby ​​vorschlägt, ist uniq eine gültige Syntax für Ruby. Während der Fehler die Sprache als groovy anzeigt, bedeutet das, dass das Skript als grooviges Skript und nicht als Ruby-Code ausgeführt wurde. Die Standardsprache ist groovy. Ihre Lösung ist im Wesentlichen die gleiche wie meine Antwort. – Rahul

1

Dieser Code löste das Problem:

x = ['test1', 'test2'] 
client.update index:'test', type:'test', id:'1', body:{script:"ctx._source.a += x; ctx._source.a.unique()", params: {x:x}} 
+0

ctx._source.a.unique() funktioniert perfekt. –

Verwandte Themen