de.comp.lang.php.* FAQ

17.13. Wie realisiere ich eine Volltextsuche mit MySQL?

Antwort von Matthias P. Wuerfl

Um eine Volltextsuche für eine Website zu realisieren, eignen sich speziell dafür erstellte Tools besser. Siehe hierzu auch Wie kann ich eine Volltextsuche realisieren?.

Liegen die Inhalte der Website in einer MySQL-Tabelle, so kann man jedoch auch MySQL zur Suche verwenden. Für den "Hausgebrauch" sollte das auf wenig belasteten Servern oft reichen. MySQL bietet hierzu ab der Version 3.23.23 die Möglichkeit, einen Volltextindex anzulegen.

Um die Spalte einer Tabelle mit einem solchen Index zu belegen muss das SQL-Statement ALTER TABLE tabellenname ADD FULLTEXT (textpalte) ausgeführt werden, welches einen entsprechenden Wortindex anlegt. Anschließend kann mit einer Query wie SELECT * FROM tabellenname WHERE MATCH textspalte1 AGAINST ('suchtext') der Index durchsucht werden. Dieser Wortindex reagiert nur auf ganze Worte, es kann also nicht nach Teilworten oder Wortkombinationen gesucht werden. Die Suche nach "Bauer" findet also nicht "Bauernhof".

Der Ausdruck MATCH a AGAINST b gibt einen Zahlenwert zurück, der die Relevanz des gefundenen Datensatzes wiedergibt, er kann also auch im SELECT-Teil eines SQL-Statements sinnvoll eingesetzt werden. Im ORDER BY-Teil des Statements braucht er nicht vorzukommen, denn MySQL sortiert automatisch nach Relevanz, wenn im WHERE-Teil der Volltextindex abgefragt wird.

SELECT   * FROM tabellenname
WHERE    MATCH textspalte AGAINST ('wort1 wort2')

...gibt alle Datensätze aus, in denen eines der Suchworte in textspalte vorkommt - nach Relevanz absteigend sortiert.

Hat man eine MySQL-Version älter als 3.23.23, dann kann man auch eine Volltextsuche realisieren. Diese geht jedoch dann wesentlich langsamer vonstatten und belastet den Datenbankserver unverhältnismäßig stark, da MySQL hier nicht den Index benutzen kann.

SELECT   * FROM tabellenname
WHERE    textspalte LIKE '%wort1%'
OR       textspalte LIKE '%wort2%'

Das Prozentzeichen hat im LIKE-Statement von SQL die Funktion, die man in anderen Situationen auch vom Sternchen (*) her kennt. Diese Query findet auch Teilwörter. Die Suche nach "Bauer" findet also auch "Bauernhof".

Antwort von Guido Haeger

Ab Version 4.0.1 bietet MySQL für den Ausdruck MATCH a AGAINST b zusätzlich einen BOOLEAN MODE. Dadurch ist es möglich genauere Suchabfragen zu definieren und die Gewichtung einzelner Spalten beim Ranking der Treffer zu beeinflussen

SELECT felder FROM tabellenname
WHERE MATCH textspalte AGAINST 
('+Docu -PHP' IN BOOLEAN MODE)

Eine Übersicht der zulässigen Operatoren und deren Wirkung findet sich in der MySQL-Dokumentation

Valid HTML 4.01! Valid CSS!

17.13. Wie realisiere ich eine Volltextsuche mit MySQL?
http://www.php-faq.de/q/q-mysql-volltextsuche.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team