66 Stimmen

MySQL: Volltextsuche und Suche mit LIKE für Worte mit 3 Buchstaben kombinieren

Tutorial von Stefan Trost | 13.06.2012 um 21:53

Die Volltextsuche von MySQL ist meistens auf eine Wortlänge von mindestens 4 Buchstaben beschränkt. In diesem Tipp habe ich beschrieben, wie man die Einstellungen von MySQL ändern kann, um auch Worte mit 3 Buchstaben mit der Volltextsuche suchen zu können.

Allerdings gibt es Situationen, in denen man die minimale Wortlänge nicht ändern kann. Zum Beispiel wenn man bei einem Hoster ist, der es nicht erlaubt, diese Einstellungen seinen eigenen Bedürfnissen anzupassen.

Für diesen Fall kann man sich aber immer noch einem Trick bedienen, der die Suche nach kürzeren Worten möglich macht: Wir kombinieren die Volltextsuche (für die langen Worte) mit einer LIKE-Suche für alle kürzeren Worte. In diesem Tutorial zeige ich einen Ansatz, wie man vorgehen kann.

Der PHP Code

Im Beispiel möchten wir in der Spalte "text" sowohl Worte mit 3 Buchstaben als auch längere Worte finden. Schauen wir uns zunächst den kompletten PHP Code an, bevor wir zu einer Erklärung kommen:

$suchworte = explode(' ', $suchstring);
$langeworte = '';
$kurzeworte = '';

foreach ($suchworte as $wort) {
   if (mb_strlen($wort, 'UTF-8')>3) {
      $langeworte.=' +'.$wort;
   } else {
      if (mb_strlen($wort, 'UTF-8')==3) {
         $wort = strtolower($wort);   
         if (!in_array($wort, array('und','der','die','das')))
            $kurzeworte.=" AND text LIKE '%$wort%'";
      }	
   }
}

$mysqlabfrage = "SELECT * FROM tabelle WHERE 
MATCH (text) AGAINST ('$langeworte' IN BOOLEAN MODE) $kurzeworte";

Das, wonach wir suchen möchten steht in der Variable $suchstring. Diese sollte aber nicht direkt aus einer POST-Variable kommen, um MySQL Injections zu verhindern - aber das ist ein anderes Thema.

Wir splitten in der ersten Zeile $suchstring an einem Leerzeichen auf, so dass wir einen Array $suchworte bekommen, in dem all unsere Suchworte nacheinander gespeichert sind.

Anschließend durchlaufen wir unseren Array $suchworte und schauen, welche Wortlänge die einzelnen Worte haben. Ist die Wortlänge größer als 3, fügen wir das Wort zu dem String $langeworte hinzu. Ist die Wortlänge genau 3, fügen wir das Wort zusammen mit einer LIKE-Suche dem String $kurzeworte hinzu. Vorher können wir noch schauen, ob wir wirklich nach diesem Wort suchen möchten. Im Beispiel sortieren wir Worte wie "und", "der", "die" und "das" aus, die wenig Relevanz haben sollten. Diese Liste lässt sich natürlich noch durch Worte wie "ist" oder "ein" erweitern. Genauso könnten wir das Skript noch erweitern, in dem wir eine Behandlung für zweibuchstabige Worte hinzufügen.

Ist unsere Schleife durchlaufen, haben wir die langen von den kurzen Worten getrennt. Unsere langen Worte stehen in $langeworte, unsere kurze in $kurzeworte. Aus diesen beiden Variablen basteln wir in den letzten Zeilen eine MySQL Abfrage und wir sind fertig.

AntwortenPositivNegativDatumStimmen
44 Stimmen

Vielen Dank für die gute Idee. Hat bei mir erst funktioniert, nachdem ich "AND" durch "OR" ersetzt hatte. Scheint mir auch logisch, denn er soll ja die langen ODER die kurzen Worte finden, er findet kaum Textstellen, wo lange und kurze vorkommen.
31.08.2015 um 16:30

AntwortenPositiv Negativ
44 Stimmen

Das kommt natürlich darauf an, was man haben will und wonach man suchen will - also ob man eine UND-Suche verwenden will wo jedes Wort vorkommen muss oder eine ODER-Suche wo mindestens eines der Worte vorkommen soll.
01.09.2015 um 19:19

Positiv Negativ
Antworten
Antworten

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Die Askingbox-Suche

Info | 0 Kommentare

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.