Dokumente neu indizieren mit der Reindex-API
•
Wenn sich die Struktur eines Dokuments oder die Art der Indizierung in einer Anwendung im Nachhinein ändert ist es oft notwendig, die bestehenden Daten neu zu indizieren. Dazu kann entweder die primäre Quelle der Daten zum Einsatz kommen oder die Dokumente werden vom existierenden Index in einen neuen kopiert. Im Buch ist dazu im Anhang beschrieben, wie stream2es genutzt werden kann, um Daten von einem Index in einen neuen zu übertragen. Seit der Version 2.3 gibt es in Elasticsearch jetzt die Reindex-API, die die selbe Funktionalität ohne die Nutzung externer Tools bietet.
Daten neu schreiben
Um die Daten wie im Buch beschrieben von einem Index conference1
in einen Index conference2
zu kopieren kann ein Aufruf wie der folgende verwendet werden.
curl -XPOST "http://localhost:9200/_reindex" -D'
{
"source": {
"index": "conference1"
},
"dest": {
"index": "conference2"
}
}'
Als Ergebnis erhalten wir eine Zusammenfassung des Vorgangs.
{
"took": 383,
"timed_out": false,
"total": 3,
"updated": 0,
"created": 3,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": 0,
"failures": []
}
Die neu indizierten Dokumente stehen jetzt im Index conference2
zur Verfügung. Wie man an der Rückgabe sieht können auch Dokumente in einen existierenden Index übertragen werden. Wird beispielsweise in conference1
ein neues Dokument hinzugefügt und wir führen den Aufruf erneut durch erhalten wir die folgende Rückgabe.
{
"took": 47,
"timed_out": false,
"total": 4,
"updated": 3,
"created": 1,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": 0,
"failures": []
}
Drei bestehende Dokumente wurden aktualisiert und ein neues angelegt.
Standardmäßig werden eventuell bestehende Änderungen im neuen Index überschrieben. Durch die Eigenschaft version_type
oder op_type
kann das Verhalten bei Konflikten feingranular gesteuert werden.
Daten filtern
Neben dem kompletten Kopieren der Daten aus einem Index ist es auch möglich nur eine Teilmenge der Dokumente zu übertragen. Dabei kann z.B. eine Query übergeben werden, die die Menge einschränkt. Um beispielsweise alle Vorträge neu zu indizieren, die bei einer JUG stattgefunden haben, kann die folgende Abfrage verwendet werden.
curl -XPOST "http://localhost:9200/_reindex" -d'
{
"source": {
"index": "conference2",
"query": {
"match": {
"conference.name": "JUG"
}
}
},
"dest": {
"index": "conference3"
}
}'
Alternativ kann über den Typen oder über die Angabe der Anzahl in Kombination mit einem Sortier-Kriterium eingeschränkt werden.
Daten modifizieren
Da die Namensgebung bekanntlich eines der schwierigsten Probleme in der Informatik ist kann es vorkommen, dass man eine Eigenschaft im Nachhinein umbenennen möchte. Die Reindexing-API bietet auch hierfür eine Möglichkeit. Über Skripte können die Inhalte eines Dokuments verändert werden. Beispielsweise kann aus dem englischsprachigen title
-Attribut ein titel
werden.
curl -XPOST "http://localhost:9200/_reindex" -d'
{
"source": {
"index": "conference2"
},
"dest": {
"index": "conference4"
},
"script": {
"inline": "ctx._source.titel = ctx._source.remove(\"title\")"
}
}'
Damit Groovy-Skripte ausgeführt werden können, muss dieses vorab in elasticsearch.yml
über die Einstellung script.inline: true
erlaubt werden.
Neben den eigentlichen Inhalten können auch viele Metadaten zu Dokumenten verändert werden. Für diese und viele weitere Details sei auf die entsprechende Dokumentation verwiesen.