Thomaier: MySQL : mit regulären Ausdrücken Wörter für Buchstaben suchen

Beitrag lesen

Hallo,

gleich vorweg: Ich nutze MySQL Version 5.0.51b.

Ich habe eine meiner Meinung nach nicht sehr komplexe Anwendung geschrieben, die mit Hilfe einer Worttabelle die Wörter herausfiltert, in denen die vom Nutzer eingegebenen Buchstaben vorkommen. Z.B. gibt der Nutzer "eehgnd" ein und bekommt sortiert nach Länge Ergebnisse wie "gehend, hegend, gehen, hege", etc. Zu sehen auf http://www.wort-suchen.de.
Die Tabelle enthält ein Feld "word", die restlichen Felder spielen bei der Suche keine Rolle. Alle Wörter sind ausschließlich in Großbuchstaben in der Tabelle enthalten.
Folgende Probleme haben sich mit der Zeit bei der Suche mittels regulärer Ausdrücke ergeben:

1. Doppelte Buchstaben vermeiden
Die einfache Suche erfolgt über folgende Abfrage:
SELECT word FROM word_table WHERE word REGEXP '(^[EEHGND]{0,6}$)'
Das Problem: Es werden auch sämtliche Wörter gefunden, in denen die Buchstaben mehrfach vorkommen. Ich suche also nach einer Möglichkeit, das Vorkommen einzelner Buchstaben zu beschränken. "E" kommt ja z.B. maximal zweimal vor. Derzeit muss ich in einem zweiten Schritt via PHP die zusätzlich gefundenen Wörter vor der Ausgabe löschen. Diesen zweiten Schritt würde ich mir gerne ersparen.

2.1. Joker
Ich möchte gerne die Möglichkeit geben, einen Joker einzusetzen. Damit kann ein Buchstabe (oder auch mehr) zusätzlich zu den gewählten vorkommen. Die derzeitige Abfrage sieht wie folgt aus:
SELECT word FROM word_table WHERE word REGEXP '(^[EEHGND]{0,6}.[EEHGND]{0,6}$)'
Auch hier wieder das Problem, dass ich nachträglich mit PHP aussortieren muss. Wenn ich jetzt gerne zwei Joker haben möchte, dann bekomme ich schon Probleme sowohl mit der Abfrage als auch mit der Masse an aus der Datenbank gelieferter Datensätze. Vielleicht fällt jemandem eine elegantere Lösung ein.
2.2 Umlaute
Ein weiteres Problem mit dem jetzt verwendeten Joker sind Umlaute. Die werden einfach nicht anstelle des Punktes gefunden.
SELECT word FROM word_table WHERE word REGEXP '(^[HRE]{0,3}.[HRE]{0,3}$)'
sollte meiner Meinung nach auch "Ähre" finden und tut es aber nicht, obwohl das Wort in der Datenbank vorhanden ist.

3. Wiederholung von Zeichen / Gruppen
Das Beispiel aus 2. beinhaltet auch mein 3. Problem. Das mit den ersten eckigen Klammern gefundene Zeichen soll, je nach zulässiger Anzahl, in der zweiten eckigen Klammer nicht mehr auftauchen. In PHP gibt es dazu die Möglichkeit auf Gruppen zu referenzieren. Sowas habe ich jedoch für MySQL nicht gefunden. Ich hoffe hier hat jemand eine Art Workaround.

Zu Generierung der SQL-Abfragen nutze ich PHP, in dem ich mich meines Erachtens auch ausreichend zurechtfinde. Mit geht es hier allein um die MySQL-Abfragen.

Ich habe sehr ausführlich im Internet recherchiert und denke, dass es für die meisten meiner Probleme keine einfache Lösung geben wird. Vielleicht hat hier aber jemand für das ein oder andere einen Hinweis. Das komplette Einlesen der Datenbank in PHP ist bei über 100.000 Stichwörtern keine Möglichkeit. Vielleicht habe ich mich aber generell für die falsche Herangehensweise bei einer solchen Suche entschieden, bis hin zur Auswahl von MySQL als Datenbank. Ich bin für jeden noch so kleinen Hinweis dankbar.

MfG
Thomas