Ich mache eine App, die Rückwärtssuchen benötigt. Damit meine ich, dass Benutzer der App Suchparameter eingeben und speichern; Wenn neue Objekte in das System eingegeben werden, wird eine Benachrichtigung gesendet usw., wenn sie mit den vorhandenen Suchparametern übereinstimmen, die ein Benutzer gespeichert hat.
Ich habe Schwierigkeiten, Lösungen für diese Art von Problem zu finden.
Ich benutze Django und denke darüber nach, die Suche zu erstellen und sie mit Q-Objekten zu pikieren, wie hier beschrieben: Ссылка
Wie ich es sehe, wenn ein neues Objekt in die Datenbank eingegeben wird, muss ich jede einzelne gespeicherte Abfrage aus der Datenbank laden und irgendwie gegen dieses eine neue Objekt ausführen, um zu sehen, ob es mit dieser Suchanfrage übereinstimmt. .. Das scheint nicht ideal - hat jemand schon einmal ein solches Problem angegangen?
Auf Datenbankebene bieten viele Datenbanken "Trigger".
Ein anderer Ansatz besteht darin, zeitgesteuerte Jobs zu verwenden, die regelmäßig alle Elemente aus der Datenbank abrufen, die seit der letzten Ausführung ein Datum der letzten Änderung aufweisen. dann werden diese gefiltert und Warnungen ausgegeben. Sie können möglicherweise einen Teil der Filterung in die Abfrageanweisung in der Datenbank einfügen. Dies ist jedoch ein wenig komplizierter, wenn Benachrichtigungen gesendet werden müssen, wenn Elemente gelöscht werden.
Sie können Trigger auch manuell in den Code einfügen, der Daten an die Datenbank übermittelt, was möglicherweise flexibler ist und sicherlich nicht auf bestimmten Funktionen der Datenbank beruht.
Ein guter Weg für die Kommunikation zwischen Triggern und Alarmen besteht in Nachrichtenwarteschlangen - Warteschlangen wie RabbitMQ und anderen AMQP Implementierungen werden mit Ihrer Website skalieren.
Der Aufwand, den Sie zur Lösung dieses Problems verwenden, steht in direktem Zusammenhang mit der Anzahl der gespeicherten Abfragen , mit denen Sie zu tun haben.
Vor über 20 Jahren haben wir gespeicherte Abfragen verarbeitet, indem wir sie als Minidocs behandelt und sie basierend auf allen müssen und können indexiert haben Begriffe. Die Termliste eines neuen Dokuments wurde als eine Art Abfrage für diese "Datenbank von Abfragen" verwendet, und es wurde eine Liste mit möglichen interessanten Suchvorgängen erstellt, und nur die Suchvorgänge wurden mit den neuen Dokumenten ausgeführt. Das mag kompliziert klingen, aber wenn es mehr als ein paar gespeicherte Abfragen gibt (sagen Sie irgendwo zwischen 10.000 und 1.000.000 oder mehr), haben Sie eine komplexe Abfragesprache, die eine Mischung aus boolescher und ähnlichkeitsbasierter Suche unterstützt Es hat die Zahl, die wir als Vollanfragen ausführen mussten, erheblich reduziert - oft nicht mehr als 10 oder 15 Abfragen.
Eine Sache, die half, war, dass wir die Kontrolle über die horizontale und die vertikale des Ganzen hatten Ding. 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.
Aktualisierung für Kommentar:
Kurze Antwort: Ich weiß es nicht genau.
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. (Dies war in den späten 80er / frühen 90er Jahren.)
Ich vermute, dass die Filterung von etwas, das äquivalent zu date_added
ist, in Kombination mit dem Datum der letzten Abfrage oder dem höchsten id
bei der letzten Abfrage ausgeführt werden kann. 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.
Damit ich genauer darauf eingehen kann, müssen Sie eine Menge spezifischer über genau das Problem, das Sie zu lösen versuchen, und den Umfang der Lösung, die Sie versuchen, zu erreichen.
Wenn Sie den / die Objekttyp (en) in jeder gespeicherten Suche als generische Beziehung , können Sie allen beteiligten Objekten ein Signal hinzufügen. Wenn das Signal ausgelöst wird, sucht es nur nach den Suchvorgängen, die den Objekttyp betreffen, und führt diese aus. Das wird wahrscheinlich immer noch zu Skalierungsproblemen führen, wenn Sie eine Menge Schreibvorgänge in der Datenbank und viele gespeicherte Suchen haben, aber es wäre ein einfacher Django-Ansatz.