jackieo: Suchmuster PHP/MySQL

Liebes Forum,

Problem 1:

ich habe in meiner Datenbank einen Eintrag des Ortes "Weimar".

Allerdings wird der Ort nicht gefunden, wenn man als User den Ort "Wermar" eingibt bzw. sich also vertippt.

Solch ein vertipper wird aber auf der Site http://itouchmap.com/latlong.html korrigiert, d.h. wenn man dort "Wermar" eingibt, dann wird auch trotzdem "Weimar" gefunden.

Kann man so etwas (natürlich auch für andere Fälle bzw. andere Orte) per PHP-Skript lösen, dass auch Vertipper zum richtigen Ziel weiterleiten - als Lösung hätte ich nämlich daran gedacht, alle Vertipper extra in der Datenbank abzuspreichern, aber das wäre ja ein Riesen-Aufwand...

Problem 2:
wie mache ich das ganze mit Umlauten, d.h. in meiner Datenbank steht als Ort "München" - allerdings bei der Suche nach "Muenchen" oder gar in Großbuchstaben "MÜNCHEN" gibt es keinen Erfolg - muss ich da mit eregi_replace arbeiten, wenn ich den Suchstring per PHP übergebe und mit den Inhalten der Datenbank vergleiche?

Vielen Dank für Eure Tipps!
jackieo

  1. Moin!

    Problem 1:

    Solch ein vertipper wird aber auf der Site http://itouchmap.com/latlong.html korrigiert, d.h. wenn man dort "Wermar" eingibt, dann wird auch trotzdem "Weimar" gefunden.

    Kann man so etwas (natürlich auch für andere Fälle bzw. andere Orte) per PHP-Skript lösen, dass auch Vertipper zum richtigen Ziel weiterleiten - als Lösung hätte ich nämlich daran gedacht, alle Vertipper extra in der Datenbank abzuspreichern, aber das wäre ja ein Riesen-Aufwand...

    Die direkte Antwort auf deine Frage lautet: Ja, kann man.

    Und die Umsetzung gibts entweder in datenaufwendig und performant, oder in datensparsam, aber unperformant.

    Datenaufwendig wäre die Version, alle Tippfehler in einer Index-Tabelle ihren korrekten Worten zuzuweisen. Wenn man die Menge der vertippbaren Zeichen einschränkt, beispielsweise sich auch am möglichen Tastaturlayout orientiert, lässt sich auf diese Weise auch automatisch generieren, was Menschen so eintippen könnten.

    In Performanceaufwendig ist die Version, mit der Funktion levenshtein() (sieht wie ein Tippfehler aus, aber der Mensch hieß halt so) die minimale Anzahl an notwendigen Zeichenveränderungen zu berechnen, um vom Suchwort zum möglichen Treffer zu gelangen. Das ist allerdings aufwendig, weil das Suchwort mit jedem Datenbankeintrag verglichen werden muss.

    Außerdem existiert im normalen MySQL keine derartige Funktion. Man kann sich sowas nachrüsten (http://www.teamarbyte.de/levenshtein.html) (laut Beschreibung sorgt der dritte Parameter als maximale Levenshtein-Distanz für Performanz), die Alternative wäre eine Implementierung in PHP (http://de2.php.net/levenshtein), die aber extrem unperformant laufen dürfte. Für jedes Suchwort muss ja immer die gesamte Tabelle abgefragt, ausgelesen und verglichen werden, es lässt sich nichts vorberechnen.

    Problem 2:
    wie mache ich das ganze mit Umlauten, d.h. in meiner Datenbank steht als Ort "München" - allerdings bei der Suche nach "Muenchen" oder gar in Großbuchstaben "MÜNCHEN" gibt es keinen Erfolg - muss ich da mit eregi_replace arbeiten, wenn ich den Suchstring per PHP übergebe und mit den Inhalten der Datenbank vergleiche?

    Die Kollation der jeweiligen Spalte ist entscheidend für die "Gleichheit" bei Abfragen in der Datenbank. Alle Kollationen mit "_ci" vergleichen ohne Berücksichtigung von Groß/Kleinschreibung. Und je nach Kollation gibt es für die deutschen Umlaute unterschiedliche Gleichheitsbedingungen:

    latin1_german1_ci und utf8_unicode_ci behandeln "ü" wie "u".
    latin1_german2_ci behandelt "ü" wie "ue".

    Lies dazu am Besten das Handbuch: http://dev.mysql.com/doc/refman/5.0/en/charset-collation-effect.html

    - Sven Rautenberg

    1. In Performanceaufwendig ist die Version, mit der Funktion levenshtein() (sieht wie ein Tippfehler aus, aber der Mensch hieß halt so) die minimale Anzahl an notwendigen Zeichenveränderungen zu berechnen, um vom Suchwort zum möglichen Treffer zu gelangen. Das ist allerdings aufwendig, weil das Suchwort mit jedem Datenbankeintrag verglichen werden muss.

      Möglich wäre aber auch noch ein anderer Algorithmus für die ähnlichkeit - Soundex z.B. das geht aber nach der Klangähnlichkeit, nicht nach der Schreibweise. Das würde z.B. eingaben abfangen, bei denen der Suchende weiß wie man es ausspricht, aber nicht wie man es exakt schreibt.

      Allerdings ist Soundex sehr sprachspezifisch - sprich englischlastig.

      1. Hello,

        Allerdings ist Soundex sehr sprachspezifisch - sprich englischlastig.

        Also z.B. "pondon" anstelle von "Pendant"?

        Habe ich neulich in einem Kontaktforum gelesen im Zusammenhang mit "ich suche einen Partner mit Niveau" *grins*

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Also z.B. "pondon" anstelle von "Pendant"?

          Ja - würde beides nach Soundex P-535 liefern und ist somit "identisch".

          1. Hello,

            Also z.B. "pondon" anstelle von "Pendant"?

            Ja - würde beides nach Soundex P-535 liefern und ist somit "identisch".

            Soundex() ist also eine "Frauenversteher-Funktion"? *höhöhö*

            Ich lach mich schlapp!

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de