next up previous contents


6.3 Einige Beispiele

Nachfolgend wollen wir einige (d.h. eine kleine Auswahl) der Möglichkeiten und Grenzen des Volltextes aufzeigen. Zunächst gibt es eine Art 'Ranking', d.h jene Treffer die besser passen, erhalten einen höheren Rückgabewert:

mysql> select AkteID, Text, match(Text) 
    -> against('Seite zweite' in boolean mode) 
    -> as Treffer from seiten where match(Text) 
    -> against ('Seite' in boolean mode);
+--------+----------------------------------+---------+
| AkteID | Text                             | Treffer |
+--------+----------------------------------+---------+
|      1 | Wir erfassen eine zweite Seite   |       2 |
|      1 | Jetzt haben wir die dritte Seite |       1 |
+--------+----------------------------------+---------+
2 rows in set (0.01 sec)

Leider muss der Suchtext zweimal aufgeführt werden. Immerhin entsteht keine Performance-Einbusse (es erfolgt intern nur eine Abfrage). Das nächste Beispiel zeigt, wie wir zwei Wörter miteinander verknüpfen können (AND-Bedingung):

mysql> select * from seiten where match Text 
    -> against('+Seite +zweite' in boolean mode);
+--------+-------+--------------------------------+------+
| AkteID | Seite | Text                           | Bild |
+--------+-------+--------------------------------+------+
|      1 |     2 | Wir erfassen eine zweite Seite | NULL |
+--------+-------+--------------------------------+------+
1 row in set (0.00 sec)

Hätten wir die beiden Suchbegriffe ohne das '+'-Zeichen eingegeben, so wäre aus der AND-Verknüpfung eine ODER-Verknüpfung entstanden. In der Praxis wird das problematisch sein, da die User nur schwer davon zu überzeugen sein dürften, jedesmal ein '+'-Zeichen einzugeben. Zwar könnte MySQL so kompiliert werden, dass MySQL 'normal' tickt, es dürfte aber (beim Programmieren von Applikationen) einfacher sein, die Eingabe der User zu parsen und mit einem '+'-Zeichen zu versehen.

Einen Vorteil hat das Pluszeichen aber dennoch. Wir können damit sehr einfach Wörter ausschliessen:

mysql> select * from seiten where match Text 
    -> against('+Seite -zweite' in boolean mode);
+--------+-------+----------------------------------+------+
| AkteID | Seite | Text                             | Bild |
+--------+-------+----------------------------------+------+
|      1 |     3 | Jetzt haben wir die dritte Seite | NULL |
+--------+-------+----------------------------------+------+
1 row in set (0.01 sec)

Image tip.png An dieser Stelle sei noch darauf hingewiesen, dass wir auch nach Wortteilen suchen können, wenn auch nur am Anfang, wie das zweite Beispiel unschwer zeigt:

mysql> select * from seiten where match Text 
    -> against('Fels*' in boolean mode);
+--------+-------+---------------------------+------+
| AkteID | Seite | Text                      | Bild |
+--------+-------+---------------------------+------+
|      1 |     1 | Ferien, Felsberg, Schweiz | NULL |
+--------+-------+---------------------------+------+
1 row in set (0.00 sec)

mysql> select * from seiten where match Text 
    -> against('*berg' in boolean mode);
Empty set (0.00 sec)

Zum Schluss möchte ich noch anfügen, dass uns die zahlreichen 'Aber' nicht davon abhalten sollten, die MySQL-Volltextindexierung positiv zu werten. Im Mengentest hat MySQL respektable Ergebnisse erreicht. Auf einem P4-Computer (512 MByte Ram) dauerte das Indexieren von ca. 2,2 GByte Textmasse ca. 80 Minuten. Und sofern ich 'in boolean mode' verwendet habe, erzielte ich Trefferzeiten im tiefen Sekundenbereich.



next up previous contents

Dokument als PDF anzeigen -- © 2003-06-15 by Urs Pfister, CH-8057 Zürich