Volltextsuche mit InnoDB


93

Ich entwickle eine hochvolumige Webanwendung, in der ein Teil davon eine MySQL-Datenbank mit Diskussionsbeiträgen ist, die reibungslos auf über 20 Millionen Zeilen anwachsen muss.

Ich hatte ursprünglich vor, MyISAM für die Tabellen zu verwenden (für die integrierten Volltextsuchfunktionen ), aber der Gedanke, dass die gesamte Tabelle aufgrund eines einzelnen Schreibvorgangs gesperrt wird, lässt mich schließen. Sperren auf Zeilenebene sind viel sinnvoller (ganz zu schweigen von den anderen Geschwindigkeitsvorteilen von InnoDB beim Umgang mit großen Tabellen). Aus diesem Grund bin ich ziemlich entschlossen, InnoDB zu verwenden.

Das Problem ist ... InnoDB verfügt nicht über integrierte Volltextsuchfunktionen.

Sollte ich mit einem Suchsystem eines Drittanbieters arbeiten? Wie Lucene (c ++) / Sphinx ? Hat einer von euch Datenbank-Ninjas Vorschläge / Anleitungen?Der Zoie von LinkedIn (basierend auf Lucene) scheint im Moment die beste Option zu sein... da ich auf Echtzeitfunktionen aufgebaut bin (was für meine Anwendung ziemlich wichtig ist), zögere ich ein wenig, mich noch ohne Einsicht zu verpflichten ...

(Zu Ihrer Information: Ich werde mit High-Memory-Rigs auf EC2 sein und PHP als Frontend verwenden.)


Antworten:


50

Ich kann dafür bürgen, dass MyISAM-Volltext eine schlechte Option ist - selbst wenn ich die verschiedenen Probleme mit MyISAM-Tabellen im Allgemeinen außer Acht lasse, habe ich gesehen, dass das Volltext-Material von den Schienen gerät und anfängt, sich selbst zu beschädigen und MySQL regelmäßig zum Absturz zu bringen.

Eine dedizierte Suchmaschine wird hier definitiv die flexibelste Option sein - speichern Sie die Post-Daten in MySQL / innodb und exportieren Sie den Text dann in Ihre Suchmaschine. Sie können ganz einfach eine regelmäßige vollständige Indexerstellung / -veröffentlichung einrichten und Indexaktualisierungen in Echtzeit hinzufügen, wenn Sie dies für erforderlich halten und die Zeit verbringen möchten.

Lucene und Sphinx sind gute Optionen, ebenso wie Xapian , das schön und leicht ist. Wenn Sie sich für Lucene entscheiden, gehen Sie nicht davon aus, dass Clucene besser wird, auch wenn Sie es vorziehen, nicht mit Java zu ringen, obwohl ich nicht wirklich qualifiziert bin, die Vor- und Nachteile von beiden zu diskutieren.


7
Solr (basierend auf Lucene) kann enorm skalieren und ist sehr leistungsstark und flexibel. Wir haben Solr (speziell die LucidWorks for Solr Edition) eingesetzt und ich kann sagen, dass es ein großer Gewinn war. Sphinx hat auch einige ernsthafte Versprechen, aber letztendlich kann das Fehlen von Datentypen zumindest für unsere Anwendung problematisch sein. Sphinx ist sehr schnell und wenn es Ihren Bedürfnissen entspricht, ist es auch eine gute Wahl.
Cody Caughlan

Vielen Dank euch beiden; tolle Antworten. Ich habe Solrs Dokumente durchgesehen, und das scheint eine großartige Lösung zu sein. Ich verstehe, dass es auch einige große Websites antreibt. Ich denke, Solr ist das Ticket. Danke Leute. Es ist auch gut, etwas über Ihre MyISAM-Kopfschmerzen zu erfahren, Ian ... diese sollten Sie in Zukunft berücksichtigen. Bei anderen Projekten werde ich nicht mehr versuchen, die Volltextfunktion zu verwenden.
Brianreavis

11
Haben Sie sich gefragt, warum Ian gesagt hat: "Gehen Sie nicht davon aus, dass Clucene besser wird"? Als Mitglied des Clucene-Kernteams bin ich vielleicht nicht so objektiv, aber mir scheint, dass der optimierte C ++ - Port einer Java-Bibliothek die Leistung auf dem Dach steigern wird. Ich würde jedem empfehlen, solche Kommentare nicht zu veröffentlichen, ohne zumindest einen Blick auf das Produkt zu werfen, das sie entehren.
Synhershko

4
Wenn Sie MyISAM zuschlagen, müssen Sie wirklich genauer sein. "Off the Rails" ist sehr vage und möglicherweise darauf zurückzuführen, dass ein einzelner Fehler in dem von Ihnen verwendeten Build möglicherweise behoben wurde.
Bobobobo

6
Was aber, wenn Sie nicht die Möglichkeit haben, Software auf dem Server zu installieren - welche Alternativen gibt es in diesem Fall?
Acme


11

Sie sollten eine Stunde damit verbringen, die Installation und Probefahrt von Sphinx und Lucene durchzuführen. Überprüfen Sie, ob beides Ihren Anforderungen in Bezug auf Datenaktualisierungen entspricht.

Eines der Dinge, die mich an Sphinx enttäuscht haben, ist, dass es inkrementelle Einfügungen nicht sehr gut unterstützt. Das heißt, es ist sehr teuer, nach dem Einfügen neu zu indizieren, so teuer, dass die empfohlene Lösung darin besteht, Ihre Daten in ältere, unveränderliche Zeilen und neuere, flüchtige Zeilen aufzuteilen. Jede Suche, die Ihre App durchführt, müsste also zweimal suchen: einmal im größeren Index für alte Zeilen und auch im kleineren Index für aktuelle Zeilen. Wenn dies nicht in Ihre Nutzungsmuster integriert ist, ist diese Sphinx keine gute Lösung (zumindest nicht in der aktuellen Implementierung).

Ich möchte auf eine andere mögliche Lösung hinweisen, die Sie in Betracht ziehen könnten: Google Custom Search . Wenn Sie SEO für Ihre Webanwendung anwenden können, lagern Sie die Indizierungs- und Suchfunktion an Google aus und binden Sie ein Google-Suchtextfeld in Ihre Website ein. Dies könnte die wirtschaftlichste und skalierbarste Möglichkeit sein, Ihre Website durchsuchbar zu machen.


Danke, Bill. Ja, die Sphinx-Dokumentation hat mich ein wenig darüber schwanken lassen, wie sie mit den Indexaktualisierungen umgeht. Gut, dass es bestätigt wird. Ich stelle mir vor, dass ein solches System für mich wahrscheinlich zu einem Albtraum werden würde. Die benutzerdefinierte Google-Suche ist eine Option. Mein Hauptproblem dabei ist jedoch nur der Nicht-Echtzeit-Index und die mangelnde Anpassung. Das Styling der Ergebnisse und das Abrufen zusätzlicher Daten sind für mich ziemlich wichtig. Vielen Dank, dass Sie sich angemeldet haben - die Sphinx-Informationen sind auf jeden Fall gut zu wissen!
Brianreavis

3

Vielleicht sollten Sie MySQLs FT nicht so schnell schließen. Craigslist hat es benutzt .

Die Geschwindigkeit und Volltextsuche von MySQL hat es Craigslist ermöglicht, ihre Benutzer zu bedienen. Craigslist verwendet MySQL, um ungefähr 50 Millionen Suchvorgänge pro Monat mit einer Rate von bis zu 60 Suchvorgängen pro Sekunde durchzuführen. "

bearbeiten

Wie unten kommentiert, scheint Craigslist Anfang 2009 irgendwann auf Sphinx umgestellt zu haben .


Der Artikel, den ich verlinkt habe, erwähnt Sphinx nicht und Nik zitiert keine Quelle, die besagt, dass Craigslist überhaupt Sphinx verwendet
Bobobobo

Das PDF der Fallstudie sieht aus wie 2004, als zu diesem Zeitpunkt 50 Millionen Suchanfragen pro Monat durchgeführt wurden. Auf der Sphinx-Seite werden 50 Millionen Suchanfragen pro Tag angegeben , was wahrscheinlich den Grund für die Umstellung auf eine dedizierte Suchlösung erklärt.
Halil Özgür

1

Sphinx ist, wie Sie betonen, ziemlich nett für dieses Zeug. Die ganze Arbeit ist in der Konfigurationsdatei. Stellen Sie sicher, dass Ihre Tabelle mit den Zeichenfolgen einen eindeutigen Ganzzahl-ID-Schlüssel enthält, und es sollte Ihnen gut gehen.


0

Versuche dies

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0

0

Sie sollten sich Sphinx ansehen. Es ist ein Versuch Wert. Die Indizierung ist superschnell und verteilt. Sie sollten sich dieses Webminar (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown) ansehen. Es spricht über das Suchen und hat einige nette Benchmarks. Sie können es hilfreich finden.



0

Für alle, die an einer älteren Version von MySQL / MariaDB festhalten (dh CentOS-Benutzer), bei der InnoDB keine Volltextsuche unterstützt, bestand meine Lösung bei der Verwendung von InnoDB-Tabellen darin, eine separate MyISAM-Tabelle für das zu erstellende Objekt zu erstellen.

Zum Beispiel war meine InnoDB-Haupttabelle productsmit verschiedenen Schlüsseln und referenzieller Integrität. Ich habe dann eine einfache MyISAM - Tabelle erstellt namens product_searchzwei Felder enthalten, product_idund product_namewobei letztere wurde auf einen Set - FULLTEXTIndex. Beide Felder sind praktisch eine Kopie der productHaupttabelle.

Ich suche dann in der MyISAM-Tabelle mit Volltext und mache einen inneren Join zurück zur InnoDB-Tabelle.

Der Inhalt der MyISAM-Tabelle kann entweder über Trigger oder das Anwendungsmodell auf dem neuesten Stand gehalten werden.

Ich würde dies nicht empfehlen, wenn Sie mehrere Tabellen haben, für die Volltext erforderlich ist, aber für eine einzelne Tabelle scheint es eine angemessene Lösung zu sein, bis Sie ein Upgrade durchführen können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.