Wer kennt die Korrekturen von Google und anderen Suchmaschinen nicht? Sie wissen sofort was man meinen könnte wenn man sich einmal vertippt hat. Oder wie funktioniert die Rechtschreibkorrektur in Office-Anwendungen? In diesem Artikel möchte ich auf die Funktionen dahinter eingehen – speziell in PHP.
Uns stehen die folgenden Funktionen zur Verfügung:
- levenshtein
- similar_text
- soundex
- metaphone (mehr Genauigkeit liefert die Suche nach „DoubleMetaphone“ bei Google)
In mySQL gibt es die Funktion SOUNDEX() / das Schlüsselwort SOUNDS LIKE. Diese funktioniert leider etwas anders als die Funktion in PHP und so sind die resultierenden Werte nicht direkt vergleichbar. Die PHP-Funktion liefert immer eine 4-Stellige Zeichenkette zurück während mySQL für längere Strings auch eine längere Zeichenkette liefert.
Weiterhin gibt es in mySQL die Möglichkeit auf verschiedene Volltextsuch-Funktionen zurück zu greifen. In diesem Zusammenhang sei MATCH(…) AGAINST(…) genannt. Das Ergebnis dieser Funktion kann gut als Grundlage für einen Vergleich mit similar_text genutzt werden.
Da die meisten Funktionen auf die Englische Sprache optimiert sind, sollte für den Deutschen Raum eine andere Logik eingesetzt werden. Dabei hilft die Suche nach „Kölner Phonetik“ – eine Implementierung dieser Funktion findet man bereits auf PHP.net in den Kommentaren zu soundex. Zu der Funktion ist zu sagen, dass diese nicht zu hundert Prozent korrekt ist und einige kleine Änderungen notwendig sind um sie an die Definition anzupassen. Weiterhin gibt es eine Implementierung auf GitHub (über dessen Qualität ich allerdings nichts sagen kann).
Zu den Funktionen sollte man allerdings sagen, dass diese verdammt hohe Kosten verursachen und nicht besonders performant sind. Der Einsatz sollte daher gut durchdacht sein. Alternativ könnte man zu bestimmten Wörtern den Soundex beispielsweise mit in die Datenbank speichern anstatt in bei jedem Query neu zu berechnen.
Wie man die ganze Logik erweitern kann um gewissen Unschärfen zu entfernen beschreibt Adam Charnock in seinem Blog. Weitere Möglichkeiten sind der Einsatz von Pspell (bis PHP 5.3) oder Enchant.
Für die ganz großen Aufgaben und Projekte kommt sicher Apache Solr in Frage (für das ebenfalls eine PHP Extension verfügbar ist). Ein guter Einstieg in die Thematik ist sicher der Artikel „Enterprise Search with PHP and Apache Solr“ von IBM. Ein weiteren interessanten Artikel zum Thema habe ich auf PHP Gansta gefunden. In diesem Artikel wird außerdem auf Apache Lucene eingegangen (welches auch im Zend-Framework enthalten ist).
Und noch etwas weiter weg vom Thema: Hier gibt es noch ein schönes Dokument zum Thema mySQL-Performance und Volltextsuche.