Volltextsuche in MySQL
Tissy
- datenbank
Guten Tag,
ich muss im Rahmen einer Projektarbeit eine Volltextsuche realisieren. (PHP und MySQL). Ich habe mir bereits alle Kapitel dazu auf der Seite von mysql angeschaut und die Suche funktioniert wirklich gut.
Die Suche funktioniert so: Es ist lediglich ein Textfeld vorhanden, welches "name" heißt. In diesem Textfeld kann man dann z.B. "Lena Hoffmann" eingeben. Die Suche findet allerdings auch "Lena Hoffmann" wen man nur 'en ma' eingibt. Ist auch so gewollt. Umgesetzt habe ich das ganze so:
$_GET['name'] = str_replace(' ', '*) +(*', $_GET['name']);
$_GET['name'] = '+(*'.$_GET['name'].'*)';
Die ersten Beiden Zeilen verwandeln ein 'en man' in ein '+(*en*) +(*man*)'.
Die beiden Pluszeichen dafür, dass beide Wörter drin vorkommen müssen und die (**) damit vor bzw. hinter dem einzelnen Wort noch etwas stehen kann.
$query = mysql_query("SELECT uid
, firstname
, surname
FROM ".$MYSQL['table']['users']." WHERE MATCH (firstname
, surname
) AGAINST ('".$_GET['name']."' IN BOOLEAN MODE)") or die(mysql_error());
Dieser Teil code sucht dann die Eingabe.
Meine erste Frage lautet, ob man diese Suche evt. auf eine Datenbank-freundlicherer Art umsetzen könnte oder ob dieser Weg "gut" ausschaut.
Zweite Frage. Ich habe einfach immer noch nicht ganz den unterschied zwischen IN BOOLEAN MODE und WITH QUERY EXPANSION verstanden, würde aber behaupten das IN BOOLEAN MODE in meinem Fall geeignet wäre.
Dritte Frage, wie könnte ich das Script so anpassen das es egal wäre ob man ü, ö und ä oder ue, ue oder ua angibt.
Ich hoffe, dass mir jemand beim tuning meines Scripts helfen kann.
Wir kennen uns mit MySQL nicht aus, aber bevor keiner antwortet...
$query = mysql_query("SELECT
uid
,firstname
,surname
FROM ".$MYSQL['table']['users']." WHERE MATCH (firstname
,surname
) AGAINST ('".$_GET['name']."' IN BOOLEAN MODE)") or die(mysql_error());
Nur mal so nebenbei, wir haben hier maximal zwei Problemlagen, die erste ist die serverseitige Logik (PHP), sollten da Probleme auftauchen, würde sich eine Diskussion derselben in einem neuen Beitragsstrang unter dem Themenbereich "PHP" anbieten, die andere Problemlage ist "DATENBANK" bzw. SQL. Da dieser Beitrag unter "DATENBANK" gelistet ist, interessiert eigentlich nur SQL-Code, der bspw. mit und
gefärbt und zudem formatiert ist, also bspw.:
SELECT
Vorname,
-- etc.
FROM
Menschen
WHERE
(Vorname = 'Eduard')
Meine erste Frage lautet, ob man diese Suche evt. auf eine Datenbank-freundlicherer Art umsetzen könnte oder ob dieser Weg "gut" ausschaut.
Ich kann mich dünn daran erinnern, dass man so abfragen kann. Wichtig ist aber, dass der Volltextindex aufgebaut wird, also schon da ist. Das ist sicherzustellen.
Zweite Frage. Ich habe einfach immer noch nicht ganz den unterschied zwischen IN BOOLEAN MODE und WITH QUERY EXPANSION verstanden, würde aber behaupten das IN BOOLEAN MODE in meinem Fall geeignet wäre.
IN BOOLEAN MODE müsste ein "Wahr" oder "Falsch" zurückgeben, WITH QUERY EXPANSION - Moment! - http://dev.mysql.com/doc/refman/5.1/de/fulltext-query-expansion.html - ach hühner doch am besten selbst in der Doku herum. ;)
Dritte Frage, wie könnte ich das Script so anpassen das es egal wäre ob man ü, ö und ä oder ue, ue oder ua angibt.
Vorsicht, Umlaute kann man zwar richtigerweise übersetzen in Kombinationen aus Vokalen, andersrum gehts aber nicht. Mal davon abgesehen kannst Du natürlich die Stringfunktionen (Gibts ein REPLACE in MySQL?) nutzen => Doku
Gross- und Kleinschreibung (also "case sensivity" ;) kann man mit dem BINARY-Schlüsselwort unterscheidbar machen (habe ich heute hier gelernt).
Ich hoffe, dass mir jemand beim tuning meines Scripts helfen kann.
Da wird es nicht viel zu tunen geben, wenn der Index steht und der SQL-Code (diesmal schön dargestellt) ebenfalls.