it-swarm.com.de

Volltextsuche mit InnoDB

Ich entwickle eine Web-Anwendung mit hohem Volumen, wobei ein Teil davon eine MySQL-Datenbank mit Diskussionsbeiträgen ist, die reibungslos auf 20 Millionen Zeilen erweitert werden muss.

Ursprünglich hatte ich vor, MyISAM für die Tabellen zu verwenden (für die integrierten Volltextsuchfunktionen ), aber der Gedanke, dass die gesamte Tabelle aufgrund eines einzigen Schreibvorgangs gesperrt ist, macht mich zu einem Verschluss. Schlösser auf Zeilenebene sind so viel sinnvoller (ganz zu schweigen von den anderen Geschwindigkeitsvorteilen von InnoDB bei großen Tabellen). Aus diesem Grund bin ich fest entschlossen, InnoDB zu verwenden.

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

Soll ich mit einem Drittanbieter-Suchsystem gehen? Wie Lucene (c ++) / Sphinx ? Hat einer von Ihnen Datenbank-Ninjas Vorschläge/Anleitungen? LinkedIn zoie (basierend auf Lucene) scheint momentan die beste Option zu sein... die auf Echtzeitfähigkeiten aufgebaut ist (was für meine Anwendung ziemlich kritisch ist). Ich bin etwas zurückhaltend, ohne mich jedoch ein bisschen zu überlegen ...

(Zu Ihrer Information: auf EC2 mit High-Memory-Rigs, mit PHP für das Frontend)

93
brianreavis

Ich kann dafür sorgen, dass MyISAM-Volltext eine schlechte Option ist - selbst wenn ich die verschiedenen Probleme mit MyISAM-Tabellen im Allgemeinen beiseite lasse, habe ich gesehen, dass der Volltext von den Rails herunterging und anfing, sich selbst zu beschädigen und regelmäßig MySQL 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 eine periodische vollständige Indexerstellung veröffentlichung ziemlich einfach einrichten und Echtzeit-Indexaktualisierungen hinzufügen, wenn Sie das Bedürfnis verspüren und die Zeit verbringen möchten.

Lucene und Sphinx sind gute Optionen, ebenso wie/- Xapian , was schön und leicht ist. Wenn Sie sich auf die Lucene-Route begeben, 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 beidem zu diskutieren.

50
Ian Wilkes

Zusammen mit dem generellen Ausstieg von MyISAM ist InnoDB-Volltextsuche (FTS) endlich in MySQL 5.6.4 verfügbar.

Von http://dev.mysql.com/doc/refman/5.6/de/innodb-table-and-index.html#innodb-fulltext-index

Diese Indizes werden physisch als vollständige InnoDB-Tabellen dargestellt, für die SQL-Schlüsselwörter wie die Klausel FULLTEXT der Anweisung CREATE INDEX, die Syntax MATCH () ... AGAINST in einer Anweisung SELECT und die Anweisung OPTIMIZE TABLE gelten.

Während andere Engines viele verschiedene Funktionen haben, handelt es sich hierbei um InnoDB, also um native Funktionen (was bedeutet, dass es einen Upgrade-Pfad gibt), und dies ist eine lohnende Option.

55
Jeremy Smyth

Sie sollten eine Stunde verbringen und die Installation und Probefahrt von Sphinx und Lucene durchlaufen. Prüfen Sie, ob einer Ihrer Anforderungen in Bezug auf Datenaktualisierungen Ihren Anforderungen entspricht.

Was mich an Sphinx enttäuscht hat, ist, dass es keine inkrementellen Einfügungen gut unterstützt. Das heißt, es ist sehr teuer, nach einem Insert erneut zu indexieren, und zwar so teuer, dass die empfohlene Lösung darin besteht, Ihre Daten in ältere, unveränderte Zeilen und neuere, flüchtige Zeilen aufzuteilen. Jede Suche, die Ihre App durchführen muss, muss also zweimal durchsucht werden: einmal für den älteren Index nach alten Zeilen und für den letzten Index nach dem kleineren Index. 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 ein Google-Suchtextfeld in Ihre Website ein. Dies könnte die wirtschaftlichste und skalierbarste Methode sein, um Ihre Website durchsuchbar zu machen. 

11
Bill Karwin

Vielleicht sollten Sie MySQLs FT nicht so schnell schließen. Craigslist verwendet, um es zu verwenden .

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 weiter unten erläutert, scheint Craigslist Anfang 2009 auf Sphinx umgestellt zu haben.

3
bobobobo

Wie Sie wissen, ist die Sphinx für dieses Zeug ganz nett. Die gesamte Arbeit befindet sich in der Konfigurationsdatei. Stellen Sie sicher, dass das, was auch immer Ihre Tabelle mit den Strings hat, einen eindeutigen Integer-ID-Schlüssel hat. 

1
Gregg Lind

Wenn alles andere fehlschlägt, gibt es immer soundex_match

0
user1612250

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 vom Suchen und hat einige nette Benchmarks. Sie finden es vielleicht hilfreich.

0
Muhammad

versuche dies

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