2015-01-15 5 views
5

Ich verwende Elasticsearch speziell für die Paginierung, aber diese Frage könnte für jede Datenbank gelten.Umgang mit Paginierung, wenn sich die Quelldaten häufig ändern

Elasticsearch bietet Methoden zu paginate search results mit handlichen from und to Parameter. So

ich eine Abfrage get me the most recent data from result 1 to 10

Dies funktioniert gut.

Der Benutzer klickt auf „nächste Seite“ und die Abfrage ist: get me the most recent data from result 11 to 20

Das Problem ist, dass in der Zeit zwischen den beiden Abfragen, 2 neue Datensätze in die Träger Datenbank hinzugefügt wurden, was bedeutet, die paginierte Ergebnisse wird sich überlappen (die letzten 2 von der ersten Seite erscheinen als erste zwei auf der zweiten Seite).

Was ist die beste Lösung, um dies zu vermeiden? Jetzt füge ich der Abfrage einen Filter hinzu, der besagt, dass Ergebnisse nur nach dem letzten Ergebnis der vorherigen Abfrage eingefügt werden sollen. Aber es scheint nur hackisch.

Antwort

5

Ein Filter ist keine schlechte Option, wenn Sie bereits einen relevanten Zeitstempel indizieren. Sie müssen diesen Zeitstempel auf der Client-Seite verfolgen, um Ihre Abfragen korrekt vorzubereiten. Sie müssen auch wissen, wann Sie es loswerden. Aber das sind keine unüberwindbaren Probleme.

Die Scroll-API ist dafür eine solide Option, da sie auf der Elasticsearch-Seite effektiv Snapshots erstellt. Die Absicht der Scroll-API besteht darin, eine stabile Suchabfrage für tiefe Paginierung bereitzustellen, die sich mit dem genauen Problem der Änderungen befassen muss, die bei Ihnen aufgetreten sind.

Sie beginnen eine Scrolling Search, indem Sie Ihre Abfrage und die scroll Parameter, für die Elasticsearch eine scroll_id zurückgibt. Sie stellen dann Anfragen an /_search/scroll, die diese ID liefert, von denen jede eine Seite von Ergebnissen und eine neue scroll_id für die nächste Anfrage zurückgibt.

(Beachten Sie, dass Sie nicht wollen die scan Suche hier eingeben. Das verwendet wird Dokumente zu extrahieren en masse, und gelten keine Sortierung.)

Im Vergleich zu Filtern, tun Sie noch um einen Wert zu verfolgen: die scroll_id für Ihre nächste Ergebnisseite. Ob das einfacher ist als das Verfolgen eines Zeitstempels hängt von Ihrer App ab.

Es gibt noch andere mögliche Nachteile zu berücksichtigen. Elasticsearch behält den Kontext für Ihre Suche auf einem einzelnen Knoten innerhalb des Clusters bei. Möglicherweise könnten sich diese in Ihrem Cluster ansammeln, abhängig davon, wie stark Sie sich auf die Scroll-Suche verlassen. Sie sollten die Auswirkungen auf die Leistung dort testen. Und wenn ich mich richtig erinnere, bleiben scrollende Suchen auch nach einem Knotenausfall oder -neustart bestehen.

Die ES-Dokumentation für die Scroll API bietet gute Details zu allen oben genannten.

Fazit: Filtern nach Zeitstempel ist eigentlich keine schlechte Wahl. Die Scroll-API ist eine weitere gültige Option, die für einen ähnlichen Anwendungsfall entwickelt wurde, aber nicht ohne Nachteile ist.

+0

Danke für die detaillierte Erklärung. Aus irgendeinem Grund dachte ich scan/scroll war das gleiche, aber das stimmt natürlich nicht! Scroll scheint eine gute Wahl zu sein, wenn Sie nicht so etwas wie den neuesten Zeitstempel zum Filtern haben. – bradvido

+0

Wäre der Nachteil bei der Zeitstempelfilterung, dass jemand, der ein Dokument löscht, möglicherweise ein Dokument überspringt, wenn es auf der nächsten Ergebnisseite zurückgegeben wird? – writofmandamus

+0

Hinweis aus den Scroll-API-Dokumenten 'Scrolling ist nicht für Echtzeit-Benutzeranfragen gedacht,' – Ben

-1

Sie müssen die Scan-API dafür verwenden. Scan- und Scroll-API lassen Sie die Zeitsuche und Paginierung durchführen. Scan-API -

+1

Die Verwendung der Scan-API ist möglicherweise nicht die richtige Vorgehensweise. Es wird nicht nach Ergebnissen sortiert. – bittusarkar

Verwandte Themen