Michael Schröpl: Volltextsuche unter MySql

Beitrag lesen

Hi Simon,

Kann mir jemand weiter helfen wo hierbei ein Fehler ist?
Die Suchergebnisse verhalten sich nämlich völlig unzuverlässig.

Du hast offenbar eine Diskrepanz zwischen Deiner Suchfunktion und Deinen Ergebnissen.
Was von beiden möchtest Du lieber an das andere anpassen? ;-)

Der Wort-Indexer von mySQL arbeitet mit diversen Konfigurationswerten, die Du am besten dem mySQL-Quelltext entnehmen kannst (richtig konfigurierbar wird das erst in mySQL 4.x).
Ich poste Dir mal ein Stück aus einer Dokumentation von etwas, das ich basierend auf diesem FULLTEXT gebaut habe ... ach ja, es gibt auch noch eine Definition von Wort-Delimiter-Zeichen (ein wordchars-Makro), die Du auch noch verstanden  haben mußt (oder anpassen solltest - mir gefiel sie hinreichend gut).

Wenn man die Kristallkugel-Logik des FULLTEXT-Treibers mal verstanden und "zugeritten" hat, dann ist er prima. ;-)

Viele Grüße
      Michael

1. Volltext-Schlüssellänge

mySQL nimmt in seine Volltext-Indexbäume standardmäßig nur Worte mit einer Länge von _mindestens_4_Zeichen_ auf.
...
Diese Eigenschaft des FULLTEXT-Index der myISAM-Tabellen von mySQL wird durch die Konstante MIN_WORD_LEN in der Datei myisam/ftdefs.h der mySQL-Quelltext-Distribution festgelegt.

Ich habe den dort definierten Wert von 4 auf 3 geändert, den mySQL-Datenbanktreiber neu übersetzt und den Volltextindex neu aufgebaut. Durch die nun zusätzlich geindexten Worte mit genau 3 Zeichen nahm das Volumen der Indexbaumdatei um 15% zu - das ist vertretbar.
Eine merkliche Beeinträchtigung der Suchgeschwindigkeit war nicht feststellbar; genaue Messungen wurden hierfür allerdings auch nicht vorgenommen.

2. Volltext-Stopwortliste

Der mySQL-Indexer nimmt _nicht_ jedes Wort, das er bei der Zerlegung eines Textes isoliert hat, in den entsprechenden Volltextindex auf.

Sofern dies im Quelltext aktiviert ist (bei mySQL 3.23.47 ist das standardmäßig der Fall), verwendet der Indexer eine _Stopwortliste_ häufiger, aber wenig aussagekräftiger Worte, welche beim Aufbau des Indexbaums ignoriert werden sollen.
Diese Liste ist in der Datei myisam/ft_static.c der mySQL-Quelltext-Distribution als String-Array definiert und enthält in der Standardauslieferung 570 solcher Worte - überwiegend englische Begriffe, aber auch einige wenige deutsche und französische Worte.

Ich habe mir ein eigenes kleines Perl-Programm geschrieben und für einen Testdatenbestand von ... eine Wortverteilungstabelle erstellt. Von den 5% häufigsten Worten habe ich diejenigen, welche mir ähnlich wenig aussagekräftig erschienen wie die bereits in der Stopwortliste enthaltenen Begriffe, isoliert und beide Listen zusammengemischt; außerdem habe ich alle Stopworte mit weniger als drei Buchstaben (die aufgrund der von mir eingestellten erforderlichen Mindestlänge ohnehin keinen Effekt haben werden) aus der Liste gelöscht (damit der Volltextindexer sie nicht unnötigerweise trotzdem prüfen muß).
Die daraus entstandene Stopwortliste enthält nun 873 Begriffe.

Auch für diese Änderung mußte der mySQL-Datenbanktreiber neu übersetzt und der Volltextindex neu aufgebaut werden.