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:
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.
quelle
Zusammen mit dem allgemeinen Auslaufen von MyISAM ist die InnoDB-Volltextsuche (FTS) endlich in MySQL 5.6.4 verfügbar.
Viele saftige Details unter https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html .
Während andere Engines viele verschiedene Funktionen haben, ist diese InnoDB, also nativ (was bedeutet, dass es einen Upgrade-Pfad gibt), und das macht sie zu einer lohnenden Option.
quelle
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.
quelle
Vielleicht sollten Sie MySQLs FT nicht so schnell schließen. Craigslist hat es benutzt .
bearbeiten
Wie unten kommentiert, scheint Craigslist Anfang 2009 irgendwann auf Sphinx umgestellt zu haben .
quelle
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.
quelle
Versuche dies
quelle
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.
quelle
Wenn alles andere fehlschlägt, gibt es immer soundex_match , was leider nicht wirklich schnell und genau ist
quelle
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
products
mit verschiedenen Schlüsseln und referenzieller Integrität. Ich habe dann eine einfache MyISAM - Tabelle erstellt namensproduct_search
zwei Felder enthalten,product_id
undproduct_name
wobei letztere wurde auf einen Set -FULLTEXT
Index. Beide Felder sind praktisch eine Kopie derproduct
Haupttabelle.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.
quelle