Die Antwort, die Sie erhalten haben, ist richtig, aber ich denke, es lohnt sich, etwas näher darauf einzugehen.
Eine Aktualisierung ruft effektiv ein erneutes Öffnen des Lucene-Index-Lesegeräts auf, sodass der Zeitpunkt-Snapshot der Daten, nach denen Sie suchen können, aktualisiert wird. Diese Lucene-Funktion ist Teil der Lucene-Echtzeit-API.
Eine Elasticsearch-Aktualisierung stellt Ihre Dokumente für die Suche zur Verfügung, stellt jedoch nicht sicher, dass sie auf die Festplatte in einen dauerhaften Speicher geschrieben werden, da sie nicht fsync aufruft und somit keine Haltbarkeit garantiert. Was Ihre Daten dauerhaft macht, ist ein Lucene-Commit, das viel teurer ist.
Während Sie lucene reopen jede Sekunde aufrufen können, können Sie mit lucene commit nicht dasselbe tun.
Über lucene können Sie dann neue Dokumente nahezu in Echtzeit für die Suche bereitstellen, indem Sie häufig reopen aufrufen. Sie müssen jedoch weiterhin commit aufrufen, um sicherzustellen, dass die Daten auf die Festplatte geschrieben und synchronisiert werden, wodurch sie sicher sind.
Elasticsearch löst dieses "Problem", indem ein Transaktionsprotokoll pro Shard (effektiv ein Lucene-Index) hinzugefügt wird, in dem Schreibvorgänge gespeichert werden, die noch nicht festgeschrieben wurden. Das Transaktionsprotokoll ist synchronisiert und sicher, sodass Sie jederzeit Haltbarkeit erhalten, auch für Dokumente, die noch nicht festgeschrieben wurden. Sie können nahezu in Echtzeit nach Dokumenten suchen, da die Aktualisierung automatisch jede Sekunde erfolgt. Außerdem können Sie sicher sein, dass das Transaktionsprotokoll bei einem Fehler erneut abgespielt werden kann, um eventuell verlorene Dokumente wiederherzustellen. Das Schöne am Transaktionsprotokoll ist, dass es intern für andere Zwecke verwendet werden kann, beispielsweise um eine Echtzeit- Get-by-ID bereitzustellen .
Ein Elasticsearch-Flush löst effektiv ein Lucene-Commit aus und leert auch das Transaktionsprotokoll, da die Haltbarkeit durch Lucene selbst garantiert werden kann, sobald Daten auf Lucene-Ebene festgeschrieben wurden. Flush wird auch als API angezeigt und kann optimiert werden, obwohl dies normalerweise nicht erforderlich ist. Das Leeren erfolgt automatisch, je nachdem, wie viele Vorgänge dem Transaktionsprotokoll hinzugefügt werden, wie groß sie sind und wann das letzte Leeren stattgefunden hat.
_flush
und / oder_refresh
und rufe dann die_count
API an, um die Anzahl der Dokumente im alten und im neuen zu vergleichen , wobei ich erwarte, dass sie gleich sind. Aber es ist nicht. Ich muss diese APIs viele Male in einer Schleife aufrufen (mit einer Pause von 1 Sekunde am Ende jeder Iteration), bis elasticsearch endlich die richtige Anzahl von Dokumenten erhält. Gibt es eine Möglichkeit, eine API aufzurufen und zu bestätigen, dass die Dokumentanzahl korrekt ist?Durch eine Aktualisierung wird ein neues Segment geschrieben, sodass es für die Suche verfügbar ist.
Ein Flush führt zu einem Lucene-Commit. Das ist viel teurer.
Für weitere Details habe ich einen Artikel geschrieben, der einige davon behandelt: Elasticsearch von unten nach oben :)
quelle
Aktualisieren :
Spülen :
Segment ist ein Teil von Lucene. Unveränderliche Segmente machen OS-Seiten-Caches immer sauber.
Translog ist ein Teil von Elasticsearch. Translog ist auf Langlebigkeit ausgerichtet.
Referenz:
quelle