Suche und Volltextsuche mit mySQL und deutschen Umlauten

Ein kurzer Bericht über die Implementierung einer Suchfunktion für ein Projekt, das noch mit dem Encoding ISO-8859-1 läuft ( Zum Glück ist es eines der Letzten).

Für die Suchfunktion hatte ich mich zunächst auf die Volltextsuche eingeschossen, hierzu einen Volltextindex erstellt:

ALTER TABLE pruefteile ADD FULLTEXT(abteilung,kostenstelle)

Jetzt kann ich mit MATCH AGAINST meinen Suchbegriff abfragen, muß dabei genau die Spalten des Volltextindexes benutzen, aber es gibt mehrere Probleme:

  • Der Suchbegriff hat standardmäßig 4 Zeichen als Minimum
  • Bestimmte Wörter werden nicht gefunden ( Stop Words)
  • Nur ganze Wörter werden gefunden, keine Fragmente
  • Es gibt Probleme mit den Umlauten

Da ich nicht so sehr viele Datensätze habe, ca. 5000, und die Auswahl vorher schon durch bestimmte Bedingungen eingeschränkt wird, gehe ich also den Weg, der mehr Rechenleistung braucht, aber bessere Ergebnisse liefert mit der Abfrage:

WHERE abteilung LIKE ‘%suchbegriff%’ OR kostenstelle LIKE ‘%suchbegriff%’ …

Ich stosse aber auch hier an meinen Grenzen. Grund ist die Behandlung von deutschen Umlauten in mySQL. In mySQL gilt:

SELECT 'ä' = 'ae'; => TRUE

Hingegen gilt für Like:

SELECT 'ä' LIKE 'ae'; => FALSE

Dummerweise habe ich in meiner Datenbank Texte mit Umlauten ö ü ä, als auch mit umgewandelten Zeichenketten oe ue ae. Wie kann ich also alle Möglichkeiten berücksichtigen ?

Magischerweise kommt hier wieder das Laserschwert des Programmieres ins Spiel: Regular Expressions !

Auch in mySQL gibt es die Möglickeit, mit Regex zu arbeiten, aus einem LIKE wird hier ganz einfach ein RLIKE, bleibt noch die Ersetzung der Umlaute in PHP:

// mb_strtolower Erkennt auch Großbuchstabige Umlaute
$db_suchbegriff = mb_strtolower($db_suchbegriff);
$db_suchbegriff = str_replace(‘ä’,’(ä|ae)’,$db_suchbegriff);
$db_suchbegriff = preg_replace(‘/[^\|]ae[^\)]/’,’(ä|ae)’,$db_suchbegriff);

RLIKE ohne BINARY ist dann auch case-insensitive und mit mit folgendem Code bekomm ich dann meine Suchergebnisse: Ärger, Aerger, ärger und aerger wird mit jedem Suchbegriff gefunden:

$SUCHE_WHERE = " AND (
    abteilung RLIKE '(ä|ae)rger' OR
    kostenstelle RLIKE '(ä|ae)rger' )";

Fertig ist die Suche  8-)

Ein WordPress-Plugin mehrsprachig entwickeln

Nach der Anfrage, eine mehrspachige Seite zu entwickeln, geht es jetzt um die Frage, was ich bei der Entwicklung eines Plugins beachten muß, wenn ich es ebenfalls mehrsprachig anlegen möchte.

Mein erster Ansatz mit dem Plugin qTranslate zielte leider in die falsche Richtung, weil qTranslate dafür sorgt, daß Seiten und Posts in mehreren Sprachen organisiert werden, das ist bei diesem Projekt nicht nötig, Posts können in verschiedenen Sprachen abgelegt werden, das Gerüst sollte umschaltbar sein.

Den Sprach-Switcher on qTranslate werde ich allerdings trotzdem nutzen.

Weiterlesen

Webentwicklung – Wichtige Tools und Ressourcen

Für Bewerber und Interessierte eine Übersicht, welches Wissen für die Webentwicklung bei uns insgesamt gefragt ist:

Diese Liste wird von Zeit zu Zeit aktualisiert und vervollständigt.

Entwickler, die sich mit der Mehrheit der genannten Tools auskennen und freie Kapazitäten haben, können sich gerne bei uns melden !

Weiterlesen