2016-10-26 2 views
0

Ich versuche, mehrere Dokumente basierend auf einer Suchanfrage mit ES Version 2.3.4 zu aktualisieren. Mein Anwendungsfall ist die Suche nach Dokumenten, bei denen zwei Felder bestimmte Werte enthalten und dann ein neues Feld mit einem bestimmten Wert hinzufügen. Sagen wir also, ich möchte alle Mitarbeiter mit dem Vornamen "John" und dem Nachnamen "Smith" suchen und ihren Profilen ein neues Feld "job" mit dem Wert "Engineer" hinzufügen. Also meine erste Frage ist, ob es möglich ist, dies mit der "doc" -Option mit der update_by_query-API zu tun (genauso wie mit der Update-API).Elasticsearch Update von Query

Wenn nicht, und Skript verwendet werden (das ist die Art, wie ich es jetzt tue), dann vielleicht hilft jemand kann mir den folgenden Fehler loszuwerden:

{"error":{"root_cause":[{"type":"class_cast_exception","reason":"java.lang.String cannot be cast to java.util.Map"}],"type":"class_cast_exception","reason":"java.lang.String cannot be cast to java.util.Map"},"status":500} 

Der Code ich benutze wie folgt aussieht:

curl -XPOST -s 'http://localhost:9200/test_index/_update_by_query?conflicts=proceed' -d' 
{ 
"query": { 
"filtered": { 
"query": { 
"match_all": {} 
}, 
"filter": { 
"bool": { 
"must": [ 
{ 
"match": { "first_name" : "John" } 
}, 
{ 
"match": { "last_name" : "Smith" } 
} 
] 
} 
} 
} 
}, 
"script" : "ctx._source.job = \"Engineer\"" 
}' 

Wenn die gleiche Abfrage Senden (ohne die „Skript“ Feld) kein Fehler der Zählung API gemeldet wird und die richtige Anzahl von Dokumenten neu abgestimmt wird. diese

Antwort

1

Die korrekte Syntax ist:

"script": { 
    "inline": "ctx._source.job = \"Engineer\"" 
    } 
+0

Danke für die Antwort. Aber jetzt bekomme ich einen Fehler, dass groovige Skripte vom Typ Update deaktiviert sind. Weißt du, wie sie aktiviert werden können? Die Syntax des Fehlers sieht folgendermaßen aus: '{" error ": {" root_cause ": [{" type ":" script_exception "," reason ":" Skripte vom Typ [inline], operation [update] und lang [groovy ] sind deaktiviert "}]," type ":" script_exception "," reason ":" scripts vom typ [inline], operation [update] und lang [groovy] sind deaktiviert "}," status ": 500}' Another Fragen: Ist es möglich den Feldnamen als verschachteltes Feld zu haben (zB statt "Job" um "HR.job" zu haben? – mshabeeb

+0

In Ihren 'elasticsearch.yml' Dateien auf allen Knoten müssen Sie' script.engine haben .groovy.inline.update: true' und die Knoten müssen neu gestartet werden –

+0

In Bezug auf 'HR.job' denke ich, nicht 100% sicher. –