Der Aufwand, den Sie verwenden, um dieses Problem zu lösen, steht in direktem Zusammenhang mit der Anzahl der gespeicherten Abfragen, mit denen Sie zu tun haben.
Vor über 20 Jahren behandelt wir gespeicherten Abfragen von ihnen als minidocs Behandlung und ihnen die Indizierung auf der Basis aller der haben muss und Begriffe haben kann. Die Termliste eines neuen Dokuments wurde als eine Art Abfrage für diese "Datenbank von Abfragen" verwendet und erstellte eine Liste von möglichen interessanten Suchvorgängen, die ausgeführt werden mussten, und dann wurden nur diese Suchanfragen mit den neuen Dokumenten ausgeführt. Das mag verschlungen klingen, aber wenn es mehr als ein paar gespeicherte Abfragen gibt (sagen Sie irgendwo von 10.000 bis 1.000.000 oder mehr) und Sie haben eine komplexe Abfragesprache, die eine Mischung aus booleschen und ähnlichkeitsbasierten Suchen unterstützt, reduziert es erheblich Nummer mussten wir als Full-On-Abfragen ausführen - oft nicht mehr als 10 oder 15 Abfragen.
Eine Sache, die geholfen hat, war, dass wir die Kontrolle über die horizontal and the vertical der ganzen Sache hatten. Wir haben unseren Abfrageparser verwendet, um einen Parserbaum zu erstellen, und dieser wurde verwendet, um die Liste der Muss-/Kann-Begriffe zu erstellen, unter denen wir die Abfrage indiziert haben. Wir haben den Kunden davor gewarnt, bestimmte Arten von Platzhaltern in den gespeicherten Abfragen zu verwenden, da dies zu einer Explosion der Anzahl der ausgewählten Abfragen führen könnte.
Update für Kommentar:
Kurze Antwort: Ich weiß es nicht sicher.
Längere Antwort: Wir hatten es mit einer benutzerdefinierten Textsuchmaschine zu tun, und ein Teil der Abfragesyntax erlaubte es, die Doc-Sammlung auf sehr effiziente Weise zu schneiden, mit besonderem Schwerpunkt auf date_added
. Wir haben viele Spiele gespielt, weil wir pro Tag 4-10.000.000 neue Dokumente eingesammelt haben und diese gegen bis zu 1.000.000 gespeicherte Abfragen auf einem DEC Alphas mit 64 MB Hauptspeicher ausgeführt haben. (Das war in den späten 80er/frühen 90er Jahre.)
Ich vermute, dass etwas auf Filterung entspricht date_added
in Kombination verwendet getan werden könnte, das Datum der letzten Mal, wenn Sie Ihre Fragen lief, oder vielleicht die höchste id
an letzte Abfrage Laufzeit. Wenn Sie die Abfragen für einen geänderten Datensatz erneut ausführen müssen, können Sie dessen id
als Teil der Abfrage verwenden.
Um genauer zu werden, müssen Sie ein Los spezifischer über genau welches Problem Sie versuchen zu lösen und die Skala der Lösung, die Sie versuchen zu erreichen.
Ihr Konzept von "muss haben" und "haben Sie vielleicht" Suchbegriffe ist sehr sinnvoll in der Verringerung der Anzahl der gespeicherten Suchen, die gegen neue Dokumente ausgeführt werden müssen. Der zweite Teil der Frage ist mehr django bezogen - sagen Sie haben eine Modellinstanz - wie genau würde man einen Filter/eine Abfrage gegen nur diese eine Instanz ausführen, um eine boolesche Übereinstimmung zu bestimmen? – edub
+1, habe ich über Lösungen für dieses Problem nachgedacht und kam zu der gleichen Lösung. Obwohl ich immer noch nach anderen möglichen Lösungen suche, ist dieses Design viel besser, als jede gespeicherte Abfrage zu durchlaufen, um zu prüfen, ob sie mit einem neuen Eintrag übereinstimmt. Danke fürs Schreiben. –