Eine Volltextsuche soll in einem Projekt realisiert werden. Natürlich könnte man nun an eine LIKE
-Bedingung denken. Es soll aber auch über mehrere Felder hinweg gesucht werden und dies performant. Es wird also Zeit, vernünftigerweise das zu nutzen, was mySQL genau für diesen Zweck anbietet: Eine für maximale Effektivität optimierte Suchweise.
Für mySQL-Datenbanken mit einer Version kleiner 5.6.4 muss grundsätzlich zunächst eine MyIsam
-Tabelle vorliegen, um die FULLTEXT
-Möglichkeiten zu nutzen (vielen Dank an Christian für den Hinweis!). Standardmäßig werden jedoch meist Tabellen vom Typ InnoDB
erzeugt. Dies lässt sich aber leicht – und vor allem auch noch nachträglich – anpassen, mit einer einfachen ALTER TABLE
-Funktion:
ALTER TABLE tabelle ENGINE=myisam;
Schon liegt die Tabelle im gewünschten Format vor. Ein Volltextindex vom Typ FULLTEXT
lässt sich nun für alle Spalten des Typs CHAR
, VARCHAR
und TEXT
erzeugen. Dies kann bei neuen Tabellen gleich bei der CREATE TABLE
-Anweisung erfolgen:
CREATE TABLE tabelle ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, tsErstellt int(11) NOT NULL, titel VARCHAR(200), text TEXT, FULLTEXT (titel, text) ) ENGINE=myisam;
oder nachträglich mittels ALTER TABLE
:
ALTER TABLE tabelle ADD FULLTEXT (titel, text);
Das waren auch schon die Vorbereitungen auf Datenbankseite. Kommen wir nun zur Abfrage, z. B. mittels php. Hier wird in der WHERE
-Bedingung die Abfrage MATCH
benutzt. Nach Aufruf von MATCH
folgen kommasepariert in Klammern die Spalten, die durchsucht werden sollen und die indiziert werden. Danach folgt der Begriff, gegen den geprüft werden soll. Also lautet ein entsprechendes Statement beispielsweise:
$sql = "SELECT * FROM tabelle WHERE MATCH(titel, text) AGAINST ('".$_REQUEST["suche"]."');";
FULLTEXT geht seit MySQL Version 5.6.4 auch mit InnoDB-Tabellen.
Siehe:
https://dev.mysql.com/doc/refman/5.6/en/fulltext-restrictions.html
„FULLTEXT index support for InnoDB tables requires MySQL 5.6.4 or higher. „
Vielen Dank für den Hinweis, der Artikel wurde hinsichtlich dessen korrigiert!