2009-03-04 7 views
4

Was sind die Einschränkungen oder Fallstricke oder Antipattern oder Fallstricke?Mysql Volltextindizierung Einschränkungen?

Es scheint ziemlich attraktiv, anscheinend können Sie eine Suchmaschine mit fast keiner Arbeit erstellen. Aber es kann nicht ohne seine Probleme sein ...

Was sind Ihre Erfahrungen?

Antwort

4

Meiner Meinung nach ist der größte Nachteil, dass die MySQL-Volltextindizierung auf MyISAM-Tabellen beschränkt ist. Anders als InnoDB-Tabellen fehlt ihnen eine Menge wichtiger Merkmale, z. Transaktionen.

+4

Sie können dies umgehen, indem Sie eine Slave-Maschine erstellen.Der Tabellentyp auf dem Slave muss nicht mit dem Master übereinstimmen, was bedeutet, dass Ihr innodb-Master einen myisam-Slave mit Volltextsuche haben könnte. http://dev.mysql.com/doc/refman/5.1/en/replication-solutions-diffengines.html – txyoji

+0

Danke für den Hinweis, txyoji, das war mir nicht bewusst. Könnte eine Option sein, daran zu denken. –

+7

MySQL 5.6 fügt Volltext-Unterstützung für innodb-Tabellen hinzu! –

4

Bei großen Tabellen müssen Sie die Puffergröße und das Cache-Limit in Ihrer MySQL-Konfigurationsdatei erhöhen.

Auch die MATCH() - Spalten, die Sie bei der Suche verwenden, müssen mit den Spalten im Index übereinstimmen.

14

es nicht ohne Probleme sein kann ...

Es ist sicher nicht!

Jeder Suchbegriff, der nur aus blockierten Wörtern besteht, schlägt automatisch fehl. Wörter können aufgrund von minimalen/maximalen Längenbeschränkungen und/oder der Stoppwortdatei blockiert werden.

Ich fand die Standard-Stopword-Datei viel zu aggressiv, sie verhinderte viele gültige Suchen. Auch die Standard-Mindestlänge von 4 war sehr häufig für Akronyme, die man suchen möchte. Ich habe das ft_min_word_len auf 3 reduziert und die Stoppliste komplett entfernt (ft_stopword_file = ''). Doc: http://dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

Sie können auch die Suchabfrage untersuchen, um zu sehen, ob sie nur < 4-Buchstaben-Wörter enthält, und in diesem Fall auf eine LIKE-Suche zurückgreifen. Es gibt keine so einfache Möglichkeit, die Stoppliste auf Anwendungsebene zu umgehen.

Die Auswahl der Wortzeichen entspricht möglicherweise nicht Ihren Anforderungen und es ist schwierig, sie zu ändern. Zum Beispiel wird die Suche nach "Terry" nicht mit "Terry's" übereinstimmen. Im Allgemeinen gibt es keine Unterstützung für jegliche Art von Stemming, so dass "Keks" auch nicht mit "Keksen" übereinstimmt.

Schließlich, wie cg erwähnt, gibt es keine Unterstützung für InnoDB. Heutzutage möchten Sie nicht alle Ihre Daten in einer MyISAM-Tabelle speichern.

Wenn Sie über den Speicher verfügen, können Sie die kanonische Hauptversion der Daten in eine InnoDB-Tabelle einfügen und dann eine eigene MyISAM-Tabelle erstellen, die eine Kopie des Freetext-Inhalts enthält als Suchköder. Sie müssen beide Tabellen bei einer Änderung aktualisieren, aber wenn die MyISAM-Tabelle die Integrität verliert, verlieren Sie zumindest nur die Möglichkeit, die betreffenden Zeilen zu durchsuchen, anstatt die echten Live-Daten zu bummeln und Anwendungsfehler zu erhalten.

Sie können dann, wenn Sie die Zyklen übrig haben, Ihre eigene Textverarbeitung auf dem Suchkescher implementieren und Wörter abfragen, um einige der obigen Einschränkungen zu umgehen. Zum Beispiel können Sie Zeichen, die Sie Wort-Zeichen sein wollen, entziehen, Zeichen entfernen, die keine Wort-Zeichen sein sollen, und einfache manuelle englische Wortstämme ausführen.