Die MySQL-Volltextsuche ist bei MyISAM-Tabellen eine wirklich tolle Sache. Der spezielle Index „FULLTEXT“ ermöglicht es, mittels einfacher SQL-Abfrage textbezogene Ergebnisinhalte zu generieren, die mit einer LIKE-Abfrage nicht oder nur schwer zu erreichen wären.
MySQL-Fulltext Volltextsuche Beispiel
Nehmen wir einmal eine Suche in einem Shop an. Der Hersteller BIG stellt bekanntlich das Bobby Car. Eine Suche nach den Keywords „big“, „bobby“ und „car“ würde mit dem Link-SQL-Befehl folgendermaßen lauten:
SELECT * FROM produkte WHERE produktname LIKE ‚%BIG%‘ OR produktname LIKE ‚%bobby%‘ OR produktname LIKE ‚%car%‘
Die Abfrage ist sicherlich noch zu verbessern. Zeigt aber eines: Es werden auch Produkte in der Ergebnismenge auftauchen, die nicht im entferntesten etwas mit unserem Spielzeug „Bobby Car“ zu tun haben.
Die MySQL Volltextsuche schafft da ein wenig „Linderung“. Durch die Abfrage MATCH AGAINST und dem Index FULLTEXT wird die Ergebnismenge durch eine interne Relevanzbewertung wesentlich verfeinert.
SELECT * FROM produkte
WHERE MATCH (produktname) AGAINST (‚big‘,’bobby‘,’car‘)
MySQL-Volltextsuche: Minimale Wortlänge von vier Zeichen
Jedoch werden wir durch das oben gewählte Beispiel auch dank der Volltextsuche keine optimalen Ergebnisse erhalten. MySQL nimmt per Standard nur Worte in den Index, die eine Wortlänge von mindestens vier Zeichen aufweisen. Bei unserer Abfrage nach ‚big‘,’bobby‘ und ‚car‘ wird letztendlich nu rein Wort, nämlich “bobby” als Suchbegriff gewählt. Die Begriffe „Big“ und „Car“ werden aufgrund der Wortlänge unterdrückt.
MySQL-Volltextsuche: ft_min_word_len=3
Aus Gründen der Performance betrachtet MySQL bei einer Volltextsuche nur Begriffe ab einer Wortlänge von vier Zeichen. Überprüfen kann man dies mit folgender SQL-Abfrage:
SHOW VARIABLES LIKE ‚ft_min_word_len‘
Per Default ist hier der Wert “4” vorgegeben. Leider ist es aber oftmals unumgänglich, dass auch 3stellige Begriffe betrachtet werden. Dies ist nicht nur mit der deutschen Sprache ein Problem: Auch im Englischen sind (hauptsächlich) Abkürzungen relevante Suchbegriffe. So ist der Wunsch, auch 3-stellige Wörter mit in den Suchindex aufzunehmen, oftmals eine Bedingung für eine optimierte SQL-Abfrage.
HowTo: MySQL Volltext-Suche Min-Word ändern
- Vergewissern Sie sich mittels der Abfrage „SHOW VARIABLES LIKE ‚ft_min_word_len’“, dass die Wortlänge nicht Ihren Wünschen entspricht.
- Öffnen Sie die Datei „my.cnf“. Diese ist, abhängig von Ihrer Installation, beispielsweise im Ordner „/etc/mysql/“ zu finden.
- Navigieren Sie in den Abschnitt „[mysqld]“. Suchen Sie dort den Eintrag „ft_min_word_len“. Ändern Sie diesen auf „ft_min_word_len=3“, wenn Sie die minimale Wortlänge auf „3“ einstellen möchten (von einem geringeren Wert rate ich ab!). Wenn dieser Eintrag nicht vorhanden ist, tragen Sie diesen dort ein. Ist er mit einem Gatter „#“ versehen, entfernen Sie das Gatter. Speichern Sie die Datei.
- Damit die Änderung greift, muss der MySQL-Server neu gestartet werden.
- Im nächsten Schritt muss der Index neu aufgebaut werden, da der bisherige Index mit einer nicht mehr relevanten Wortlänge erstellt wurde. Am Einfachsten können Sie via phpmyadmin (sofern vorhanden) den Index löschen und neu erstellen. Der sicherlich bessere Weg geht über die MySQL-Konsole.
- Loggen Sie sich in die Konsole ein. Geben Sie danach folgenden Befehl (tbl_name anpassen) ein: REPAIR TABLE tbl_name QUICK;
- Nachdem der Index neu aufgebaut wurde, sollte unsere Volltext-Abfrage nach nach ‚big‘,’bobby‘ und ‚car‘ neuere und vor allem treffsichere Werte anzeigen. Kontrollieren können Sie die minimale Wortlänge erneut über die Abfrage SHOW VARIABLES LIKE ‚ft_min_word_len‘
Hallo,
ich hab mal ’ne Frage. Die ft_min_word_len bei MySQL ist auf 2 eingestellt. Wenn ich jetzt als Suchstring = th eingebe bekomme ich nur Ergebnisse geliefert, deren Wörter länger als 3 Zeichen sind (z.B. thüringen). Wörter mit Länge = 3 (z.B. the) werden ignoriert. Auch bei phpmyadmin. Wie kann ich das ändern?
matze
Sollte aber gehen. MySQL hast Du danach neu gestartet? Allerdings: „the“ ist ein schlechtes Beispiel, da es ein englisches Allerweltswort ist, welches vielleicht von der Suche gefiltert wird (also als unbedeutend eingestuft wird). Probier mal ein anderes Wort, was garantiert nicht in einem Filter laufen wird …