Wie schnell Buchtitel suchen?

8

Ich habe eine Datenbank von ungefähr 200k Büchern. Ich möchte meinen Nutzern eine Möglichkeit geben, ein Buch schnell nach Titel zu durchsuchen. Nun, einige Titel können Präfixe wie A, THE usw. haben und können auch Zahlen im Titel haben, so dass die Suche nach 12 Bücher mit "12", "zwölf" und "Dutzend" im Titel übereinstimmen sollte. Dies funktioniert über AJAX, also muss ich sicherstellen, dass die Datenbankabfrage wirklich schnell ist.

Ich gehe davon aus, dass die meisten Benutzer versuchen werden, mit einigen Wörtern des Titels zu suchen, also denke ich daran, alle Titel in Wörter aufzuteilen und eine separate Datenbanktabelle zu erstellen, die Wörter mit Titeln abbildet. Ich befürchte jedoch, dass dies nicht die besten Ergebnisse liefert. Zum Beispiel könnte der Buchtitel aus zwei oder drei gebräuchlichen Wörtern bestehen, und ich könnte eine Liste von Büchern mit längeren Titeln bekommen, die alle 2-3 Wörter enthalten, und die, nach der ich suche, verloren wie eine Nadel im Heuhaufen. Auch die Suche nach einem Buch mit vielen Wörtern im Titel kann die Abfrage aufgrund vieler OR-Klauseln verlangsamen.

Grundsätzlich suche ich nach einem Weg:

  • finde die Ergebnisse schnell
  • sortiere sie nach Relevanz.

Ich nehme an, das ist nicht das erste Mal, dass jemand so etwas braucht, und ich würde es hassen, das Rad neu zu erfinden.

P.S. Ich benutze derzeit MySQL, aber ich könnte bei Bedarf zu etwas anderem wechseln.

    
Milan Babuškov 08.05.2011, 15:43
quelle

5 Antworten

1

Vielleicht möchten Sie sich Apache Lucene ansehen. Dies ist ein Hochleistungs-Java-basiertes Information Retrieval System. Sie möchten einen IndexWriter erstellen und alle Ihre Titel indizieren, und Sie können Parameter hinzufügen (schauen Sie sich die Klasse an), die mit dem eigentlichen Buch verlinken. Bei der Suche benötigen Sie einen IndexReader und einen IndexSearcher und verwenden die search () -Option für sie. Werfen Sie einen Blick auf das Sample unter: src / demo und in: Ссылка Die Verwendung von Information Retrieval-Techniken lässt die Indizierung länger dauern, aber bei jeder Suche müssen Sie nicht die meisten Titel durchgehen, und insgesamt können Sie eine bessere Leistung für die Suche erwarten. Und auch, wenn Sie einen guten Analyzer wählen, können Sie Wörter wie "das", "a" ignorieren ...

    
amit 08.05.2011 16:00
quelle
1

Eine Lösung, die Ihre Datenmenge und die erforderliche Geschwindigkeit problemlos berücksichtigt, ist die Verwendung des Redis Schlüssel-Wert-Paarspeichers. So wie ich es sehe, können Sie mit Ihrer Lösung der Zuordnung von Titeln zu Schlüsselwörtern fortfahren und sie unter dem folgenden Formular speichern:

  

Stichwort: Satz von Buchtiteln

Redis hat bereits einen eingebauten festgelegten Datentyp, den Sie verwenden können.

Um die Titel der Bücher zu erhalten, die die Suchschlüsselwörter enthalten, können Sie als Nächstes den Befehl sinter verwenden, der die Schnittmenge erstellt für dich.

Alles ist im Gedächtnis getan; Daher ist die Reaktionszeit sehr schnell. Wenn Sie Ihren Index speichern möchten, verfügt redis außerdem über verschiedene Persistenz- / Caching-Mechanismen.

    
Mihai Oprea 08.05.2011 15:57
quelle
1

Apache Lucene mit Solr ist definitiv eine sehr gute Option für Ihr Problem

Sie können Solr / Lucene direkt verlinken, um Ihre MySQL-Datenbank direkt zu indizieren. Hier ist ein einfaches Tutorial, wie Sie Ihre MySQL-Datenbank mit Lucene / Solr verknüpfen können: Ссылка

Hier sind die Vorteile und Probleme der Verwendung von Lucene-Solr anstelle von MySQL Volltextsuche: Ссылка

    
rkg 08.05.2011 16:09
quelle
1

Die Verwendung eines SOUNDEX ist der beste Weg, den ich denke.

%Vor%

Für eine optimale Datenbankleistung können Sie den SOUNDEX-Wert Ihrer Titel am besten berechnen und in eine neue Spalte einfügen. Sie können den Soundex mit SOUNDEX ('Hallo') berechnen.

Beispielverwendung:

%Vor%     
Tom Claus 08.05.2011 16:04
quelle
1

Halte es einfach. Erstellen Sie einen Index für das Titelfeld und verwenden Sie den Platzhaltermustervergleich. Sie können es möglicherweise nicht schneller machen, da Ihr Flaschenhals nicht die übereinstimmende Zeichenfolge ist, sondern die Anzahl der Zeichenfolgen, die Sie mit dem Titel vergleichen möchten.

Und ich bin gerade auf eine andere Idee gekommen. Sie sagen, dass einige Wörter unterschiedlich interpretiert werden können. Wie 12, Zwölf, Dutzend. Anstatt eine Abfrage mit unterschiedlichen Interpretationen zu erstellen, sollten Sie unterschiedliche Interpretationen der Titel in einer separaten Tabelle mit einem Eins-zu-Vielen-Wert für die Bücher speichern. Sie können dann GROUP BY book_id verwenden, um eindeutige Buchtitel zu erhalten.

Sagen Sie das Buch "Ein Zehncentstück in einem Dutzend". In der Bücher-Tabelle wird es sein:

%Vor%

In Titeltabelle wird gespeichert:

%Vor%

Die Abfrage dafür: SELECT b.buch_id, b.buch_titel FROM Bücher b JOIN Titel t auf b.book_id = t.titles_book_id WHERE t.titles_title = '% 12%' GROUP BY b.book_id

Jetzt wird Einfügungen zu einer viel größeren Aufgabe, aber das Erstellen der Varianten kann außerhalb der Datenbank durchgeführt und auf einen Schlag eingefügt werden.

    
Mel 08.05.2011 15:52
quelle

Tags und Links