Frage

Wir haben eine gehostete Anwendung, die Seiten von Inhalten verwaltet. Jede Seite kann eine Reihe von kundenspezifischen Felder haben, und einige Standardfelder (Zeitstempel, Benutzernamen, Benutzer E-Mail, etc.).

Mit potenziell Hunderten von verschiedenen Websites, um das System - was ist eine effiziente Art und Weise zu filtern Griff / Suche? Bild einer Rasteransicht, die Sie verengen wollen. Sie können auf bestimmten Feldern filtern (Benutzer-ID, Datum) oder Sie können eine Volltextsuche eingeben.

Zum Beispiel: „Alles begann Seiten von Benutzer-ID 10“ wäre eine ziemlich schnelle Abfrage für eine MySQL-Datenbank sein. Aber Dinge wie „alle von einem Benutzer gestartet Seiten, deren Benutzer-ID ist 10 und Streichhölzer [einig Suchbegriff]“ für die Datenbank saugen würden, so dass es für eine Suchmaschine wie Lucene geeignet.

Im Grunde frage ich mich, wie andere große Websites diese Art der Sache zu tun. sie eine Suchmaschine 100% für alle Arten von Filtern verwenden? Haben sie Datenbankabfragen mit einer Suchmaschine mischen?

Wenn wir verwenden nur eine Suchmaschine, gibt es ein Problem mit der Verzögerungszeit für ein neues / aktualisierte Objekt wird in dem Suchindex erscheinen. Das heißt, ich habe gelesen, dass es nicht klug ist, den Index zu aktualisieren sofort , und es in den Reihen zu tun, statt. Auch wenn dies alle 5 Minuten bedeutet, werden die Nutzer verwirrt, wenn ihre kürzlich hinzugefügte Seite nicht sofort aufgeführt, wenn sie eine einfache Seite mit einer Liste (sagen wir eine Suchabfrage von „Kategorie: 5“) anzuzeigen.

Wir verwenden MySQL und haben eng auf Lucene Suche zu suchen. Gibt es eine andere Technologie, die ich nicht kenne?

Mein Gedanke ist es, eine einfache Filterung Seite anzubieten, die MySQL auf Grund Felder filtern verwendet. Dann bietet eine separate Volltextsuche Seite, die Ergebnisse ähnlich wie Google präsentieren würde. Ist dies der einzige Weg?

War es hilfreich?

Lösung

Solr oder grassyknoll beide etwas abstraktere Schnittstellen zu Lucene bieten.

Das heißt: Ja. Wenn Sie eine in erster Linie Inhalte angetrieben Seite sind, bietet Volltext über Ihre Daten suchen, gibt es etwas im Spiel über LIKE. Während MySQLs FULLTEXT- indexies nicht perfekt sind, könnte es ein akzeptabler Platzhalter in der Zwischenzeit sein.

Angenommen, Sie einen Lucene Index tun erstellen, die Verknüpfung Lucene Dokumente zu Ihren relationalen Objekten ziemlich einfach ist, einfach eine gespeicherte Eigenschaft zu dem Dokument zu indizieren Zeit hinzufügen (diese Eigenschaft kann eine URL, ID, GUID usw. sein) Dann suchen wird zu einem 2-Phasen-System: 1) Ausgabe Abfrage Lucene indexies (Display einfache Ergebnisse wie Titel) 2) Um mehr Informationen über das Objekt aus dem relationalen speichert durch seine Schlüssel

Da Instanziierung Dokumente relativ teuer in Lucene ist, dass Sie nur wollen Felder im Lucene-Index speichern gesucht, im Gegensatz Klone Ihrer relationalen Objekte abzuschließen.

Andere Tipps

Sie nicht abschreiben MySQL so leicht!

Implementieren Sie es auf die Datenbank unter Verwendung von z.B. eine Auswahl mit ‚wie‘ in der where-Klausel oder was auch immer.

Profil, fügen Sie Indizes, falls erforderlich. Roll-out eine Beta, so dass man reelle Zahlen erhält von Benutzern tatsächlichen Datenmustern -. Nicht alle Spalten könnten gleich nach gefragt werden, usw.

Wenn die Leistung saugen ist, dann ist das, wenn Sie andere Optionen in Betracht ziehen. Sie können Ihre SQL-Tuning, Ihre Datenbank, die Maschine betrachten die Datenbank läuft auf, und schließlich eine andere Technologie-Stack mit ...

Falls Sie MySQL oder PostgreSQL, eine Open-Source-Lösung verwenden, die große Werke mit ihm ist Sphinx: http://www.sphinxsearch.com/

Wir sind mit dem gleichen Problem und unter Berücksichtigung Sphinx und Lucene als mögliche Lösungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top