2016-01-03 13 views
16

Ich verwende die Elasticsearch Bulk API zum Erstellen oder Aktualisieren von Dokumenten.Elasticsearch Bulk API - Index vs Erstellen/Aktualisieren

Ich weiß zwar, ob sie erstellt oder aktualisiert werden, aber ich kann meinen Code vereinfachen, indem ich sie alle index mache, oder "upserts" im SQL-Sinne.

Gibt es einen Nachteil bei der Verwendung von index (und lassen ES es herausfinden) über die expliziten create und update?

Antwort

23

Wenn Sie create senden, müssen Sie sicherstellen, dass das Dokument noch nicht in Ihrem Index existiert sonst der Anruf fehlschlagen wird, während das gleiche Dokument mit index sendet, wird immer erfolgreich.

Wenn dann aus Leistungsgründen, wissen Sie, Sie ein Dokument erstellen werden (entweder mit create oder index) und dann werden Sie nur gerade ein paar Eigenschaften aktualisieren, dann update mit vielleicht Sinn machen.

Andernfalls, wenn Sie immer vollständige Dokumente senden, würde ich index die ganze Zeit verwenden, sowohl zum Erstellen und Aktualisieren. Immer wenn eine Aktion index angezeigt wird, erstellt ES entweder das Dokument, wenn es nicht existiert, oder ersetzt es, falls es existiert, aber der Aufruf wird immer erfolgreich sein.

2

Sie können den Index nicht für alles verwenden. Nach den docs:

Index ein Dokument als notwendig

Auch wird hinzuzufügen oder zu ersetzen, wenn Sie ein Dokument aktualisieren, könnte es sinnvoll sein, den ‚doc_as_upsert‘ Flag hinzuzufügen. Mehr Infos here und here

5

Die kurze Antwort: Nein, es gibt keinen Nachteil.

Der Endpunkt zum Erstellen und Aktualisieren sind Sonderfälle. Mit create möchten Sie nichts tun, wenn das Dokument bereits vorhanden ist. Mit update können Sie weniger Daten bereitstellen, wenn Sie nicht alle Daten des Dokuments haben, können Sie einfach ein paar Felder hinzufügen. Sie können auch sicherstellen, dass das Dokument nur indiziert wird, wenn es bereits mit dem Update vorhanden ist.

+0

Angenommen, Sie könnten ein bestimmtes Dokument sehr oft ersetzen (z. B. mehrfaches Indexieren des gleichen Dokuments). Da ES nichts wirklich "löscht", fügen Sie nicht mehr und mehr Dokumente hinzu und inkrementieren ihre Versionsnummer, was es später dem Müllsammler erlaubt, ältere Versionen aufzuräumen? In diesem Fall wird Index nicht verwendet, um den Index kurzfristig zu erweitern, was sich auf die Leistung auswirken könnte. Und wird sich die zukünftige starke Nutzung der Garbage Collection nicht auch auf die Performance auswirken? Das ist eine echte Frage, die ich mich frage, keine rhetorische Frage. Danke – cwarny

+0

Aber wenn Sie ein Dokument aktualisieren, ist es nicht holen, ändern und dann indizieren es trotzdem? Bei der Aktualisierung eines ganzen Dokuments haben wir gesagt, dass ein Dokument aktualisiert werden muss, indem es abgerufen, geändert und anschließend das gesamte Dokument neu indiziert wird. Das ist wahr. Mit der update-API können wir jedoch Teilupdates durchführen, beispielsweise einen Zähler in einer einzigen Anfrage inkrementieren. Wir haben auch gesagt, dass Dokumente unveränderlich sind: Sie können nicht geändert werden, nur ersetzt. Die Update-API muss denselben Regeln entsprechen. –

Verwandte Themen