Elasticsearch – Ein praktischer Einstieg

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.