00 Stimmen

MySQL: Suche nach ganzem Wort

Frage von Compi | 10.06.2016 um 14:56

Ich möchte gerne meine MySQL-Datenbank nach ganzen Wörtern durchsuchen. Das heißt, das Suchwort "ich" sollte auch tatsächlich nur die Einträge finden, wo "ich" als ganzes Wort vorkommt.

Mein bisheriger Ansatz war, mit LIKE '%suchwort%' zu arbeiten. In dem oben genannten Fall führt dies aber auch zu Treffern bei "sich" und "versichern", was ich natürlich nicht möchte.

Deswegen habe ich es als nächstes mit LIKE '% suchwort %' probiert. Durch die Leerzeichen am Anfang und am Ende werden damit tatsächlich nur noch die Einträge gefunden, wo mein Suchwort als Ganzes vorkommt. Probleme gibt es allerdings dafür an anderer Stelle: Datensätze, die mit dem Suchwort anfangen oder enden werden hiermit nicht gefunden, da in diesem Fall ja kein Leerzeichen vorne und hinten steht.

So kam ich auf die Abfrage SELECT * FROM tab WHERE col LIKE '% suchwort %' OR col LIKE 'suchwort %' OR col LIKE 'suchwort %' OR col = 'suchwort'. Das brachte ein deutlich besseres Ergebnis, jedoch fiel mir nun auf, dass es für Satzzeichen nicht funktioniert. Sobald ein Punkt oder ein Komma nach dem Suchwort erscheint, funktioniert es wieder nicht mehr.

Nun bin ich mit meinem Latein am Ende. Hat jemand eine Idee, wie ich für alle Fälle nach einem ganzen Wortes suchen kann? Nun auch noch alle möglichen Satzzeichen und die Kombinationen daraus aufzuführen kann es doch nicht sein.

AntwortenPositivNegativ
1Beste Antwort3 Stimmen

An deiner Stelle würde ich gar nicht mit LIKE arbeiten. Stattdessen empfehle ich die entweder einen Fulltext-Index zu erstellen oder mit regulären Ausdrücken zu arbeiten.

Wenn Du dich für die regulären Ausdrücke entscheidet, könnte eine Suche nach "suchwort" folgendermaßen aussehen:

SELECT * FROM tab 
WHERE col REGEXP '[[:<:]]suchwort[[:>:]]'

Die Wortbegrenzungszeichen [[:<:]] und [[:>:]] stehen für den Anfang beziehungsweise das Ende eines Wortes. Dies können Leerzeichen, Satzzeichen, Sonderzeichen oder aber auch der Anfang oder das Ende eines Strings sein.

Ein Nachteil von REGEXP ist die relativ schlechte Performance. Besser ist es daher, die Volltextsuche (Fulltext Search) von MySQL zu benutzen. Dafür musst du zunächst einen Fulltext-Index über die zu durchsuchenden Spalte erstellen. Danach kannst du zum Beispiel so nach einem ganzen Wort suchen:

SELECT * FROM tab
WHERE MATCH (col) AGAINST ('+suchwort' IN BOOLEAN MODE);

Die Volltextsuche erlaubt es unter anderem Wörter mit einem vorangehenden + oder - Zeichen zu suchen oder von der Suche auszuschließen. Deswegen schreiben wir hier '+suchwort'.

Für welche der beiden Varianten du dich entscheidest, ist natürlich abhängig von dem Zweck. Wird die Abfrage nur selten durchgeführt lohne sich vermutlich nicht, extra einen Volltext-Index anzulegen. Wird die Suche dagegen sehr häufig durchgeführt, ist wegen dem Performance-Vorteil zur Volltextsuche zu raten.
10.06.2016 um 19:05

AntwortenPositiv Negativ
Antworten

Ähnliche Themen

Die Askingbox-Suche

Info | 0 Kommentare

HTACCESS: URL vereinfachen

Tutorial | 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.