Spaß mit MySQL Stopwords

Gleich noch ein Problem hinterher, das auch im Zuge des Umzugs eines Projekts von MySQL 4 auf 5 aufgetreten ist: ich wollte mit einer Volltext-Suche nach einem oder mehreren Worten in einer Liste aus Worten arbeiten. In manchen Fällen enthielt die Suchwort-Liste den Begriff "help". In diesem besonderen Fall, kamen ganz ungewöhnliche Ergebnisse zustande und bestimmt Einträge wurden nicht selektiert, die aber eigentlich gefunden werden sollten. Auf dem alten MySQL4-Server funktionierte die Suche problemlos. Was war los?

Es gibt für Volltextsuchen eine Stopwords-Liste, die in der MySQL-Installation einkompiliert ist. Diese Liste enthält etliche Worte, die häufig in der Sprache vorkommen. So z.B. "an", "and", "any", "all" ... usw. und eben auch besagtes "help".

Um nun nicht MySQL neu kompilieren zu müssen, kann man auch eine externe Wortliste per Konfigurationsanweisung ft_stopword_file angeben. Also schnell eine externe Wortliste besorgen (z.B. hier), anpassen (z.B. das "help" entfernen) und eine Zeile in die /etc/mysql/my.cnf eintragen:

ft_stopword_file = /etc/mysql/common_words

Und den MySQL-Server neustarten. Anschließend sollten auch Volltext-Suchen nach "help" funktionieren. Also z.B. derartiges:

SQL:
  1. SELECT * FROM articles WHERE MATCH (tags) AGAINST ('+help +health' IN BOOLEAN MODE);

(Finde alle Einträge in der Tabelle "articles" bei denen im Feld tags sowohl "help" als auch "health" vorkommt)

Ob das Verwenden einer externen Stopwords-Datei anstatt der einkompilierten Liste sich signifikant nachteilig auf die MySQL-Perfomance auswirkt habe ich noch nicht überprüft oder rausgesucht. Sachdienliche Hinweise dazu nehme ich gern in den Kommentaren entgegen.

Ähnliche Beiträge

Leave a Reply