2016-08-26 2 views
0

Dies ist ein grooviges Skript. Das Problem ist die ctx._source.academies.remove (Index) weil ctx dort nicht sichtbar ist. Die Indexvariable ist das richtige ... aber ich kann das CTX dort nicht benutzen. Irgendwelche Vorschläge?Elasticsearch Groovy Script eachWithIndex

{ 
    "script" : "ctx._source.academies.eachWithIndex { it, index -> if(it['academy_id'] == academy_id) ctx._source.academies.remove(index) }", 
    "params": { 
     "academy_id": 344 
    } 
} 

Antwort

1

Sie dies versucht haben?

ctx._source.academies.removeAll { it['academy_id'] == academy_id } 

Im Fall, dass Sie academy_id passende eine Liste von Elementen überprüfen, dann können Sie weiter unten verwendet werden: (Die Schließung ein Kriterium erfüllen sollte)

ctx._source.academies.removeAll { it['academy_id'] in [academy_id, some_other_id] } 

Aus Elasticsearch Perspektive, nehme ich an die Skript kann wie folgt umgeschrieben werden:

{ 
    "script" : "ctx._source.academies.removeAll { it['academy_id'] in academy_ids }", 
    "params": { 
     "academy_ids": [344, 345, 346] 
    } 
} 
+0

Sie sind perfekt !!!!!! Danke .... Wie können wir das academy_id-Array erstellen? Können wir den Akademien die Paramis geben? So können wir mehrere Akademien mit mehreren IDs auf einmal löschen – Michalis

+0

Ja natürlich. Alles, was Sie brauchen, ist ein Boolean, der von der Schließung zurückkehrt. Siehe die aktualisierte Antwort. – dmahapatro

0

ist dies die beste Lösung?

def findIndex; ctx._source.academies.eachWithIndex { it, index -> if(it['academy_id'] == academy_id) findIndex = index }; ctx._source.academies.remove(findIndex) 

aber das funktioniert nur für das letzte gefundene Objekt

Verwandte Themen