• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Stringvergleich in mySQL

b4ttl3m4st3r

Neues Mitglied
Hallo.

Ich habe ein Problem bzgl. einer Datenbankabrage in mySQL und hoffe, dass mir hier jemand weiter helfen kann.
Es geht im Grunde um eine etwas schlicht gehaltene Suchfunktion, die durch Ajax in der DB nach vergleichbaren Einträgen sucht und dem Benutzer eine limitierte Liste von Vorschlägen ausgibt.

Derzeit läuft das ganze folgendermaßen ab:

PHP:
$sql = "
        SELECT
            id,
            name
        FROM
            shops
        WHERE
            name LIKE '%".$searchstring."%'
        LIMIT 10
    ";

Die Werte für 'name' in der DB enthalten Strings, die speziell für eine Suchanfrage angepasst worden sind: keine Sonderzeichen, keine Leerzeichen, alles Großbuchstaben etc. (z.B. BLUMENLADENMUELLER).
Natürlich ist auch $searchstring derart angepasst.

Ich möchte das mal anhand eines Beispiels verdeutlichen:


In der Datenbank stehen bspw. folgende Einträge:

[1] BLUMENLADENMUELLER // Blumen-Laden Müller
[2] BLUMENLADENHANSDIETER // Blumen-Laden Hans-Dieter
[3] GASTHAUSZURFROEHLICHENBLUME // Gasthaus zur fröhlichen Blume

Fall 1: Der Benutzer gibt in das Suchfeld "Blume" ein und erhält, wie erwartet, alle drei Einträge.

Fall 2: Der Benutzer gibt in das Suchfeld "Blumen" ein und erhält die Einträge [1] und [2].
[3] wird natürlich nicht mehr angezeigt, was ich allerdings sehr bedauerlich finde.

Fall 3: Der Benutzer gibt in das Suchfeld "Blumen Müller" ein und erhält keinen Eintrag aus der Datenbak.
Was ich an dieser Stelle versuche zu implementieren ist, dass bspw. in diesem Fall der Eintrag [1] BLUMENLADENMUELLER angezeigt wird.
Der Eingabestring müsste also irgendwie auf "Ähnlichkeit" o.a. überprüft werden.


Es gibt in PHP Methoden wie z.B:
PHP:
levenshtein()
,
PHP:
soundex()
oder
PHP:
similar_text()
, mit denen ich mitlerweile gut vertraut bin.
Leider hilft mir das bei meinem Problem nicht wirklich weiter, da ich beim Vergleich mittels einer dieser Funktionen die komplette Tabelle auslesen und bspw. eine Levenshtein-Distanz für jeden Eintrag berechnen würde.
Sowas wäre bei einer etwas größeren Tabelle overkill.
Der Gedanke Hash-Funktionen zu benutzen ist mir auch schon gekommen, aber in dem Gebiet habe ich (was DB in mySQL angeht) leider wenig bis gar keine Ahnung.

Hat vielleicht jemand eine Idee, wie ich die in Fall 2 und Fall 3 geschilderten Probleme auf einfache Art lösen kann?
Bin für jede Hilfe dankbar.
 
Werbung:
Danke für den Beitrag. Mit Lucene hab ich bisher noch garnicht gearbeitet, sieht aber sehr interessant aus. Ich werde mich damit später mehr befassen.
Leider kann ich damit in diesem Projekt nicht arbeiten.
 
Werbung:
Zurück
Oben