• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

MySQL Ähnlichkeitssuche

Steini1980

New member
Hallo ich bins mal wieder,

ich schreibe gerade an einem Importscript um Daten regelmäßig von einem Fremdsystem zu importieren. Nun ist es leider so, dass die Dateien im Fremdsystem nicht so gut untergliedert sind wie in meinem eigenen System, also z.B.:

Mein System: "VW", "Golf V", "1.6 Trendline"
Fremdsystem: "VW", "Golf 1.6 Trendline" oder auch "Trendline Golf"

In meiner Spalte "Golf V" stehen auch andere Autos, also benötige ich eine Funktion zum Vergleichen und Nachschlagen, damit ich dann das richtige Fahrzeug ermitteln kann.

Die SQL-Query wäre demnach so ähnlich wie:

SELECT * FROM `modelle` WHERE `modell` [BEINHALTET oder IST ÄHNLICH] "Golf 1.6 Trendline"

Weiss jemand weiter?!
 
Nö, nicht wirklich... Zumal der Text im Fremdsystem meist länger ist und sogar Fehler enthalten kann (es ist dort ein Freitext Feld). In meinem System muss dahingegen der Wert nachgeschlagen werden.

Wenn der kürzere Text wenigstens vom Fremdsystem kommen würde, dann könnte ich evtl. mit REGEXP arbeiten. Da aber ein längerer Text im Fremdsystem ist, da dort nicht nur Modell sondern auch die Ausführung (Motor, Edition etc.) zu finden sind.

Genaugenommen müsste ich überprüfen, in welchem Feld der meiste Text übereinstimmt oder ggf. am ähnlichsten ist.

Nachgeschlagen werden soll in meinem System: "Golf V"
Im Fremdsystem ist dieser Text hinterlegt: "Trendline Golf 1.6"
Das Fett markierte soll nochmal die übereinstimmung verdeutlichen.
 
Und was spricht gegen
Code:
SELECT * FROM `modelle` WHERE `modell` like "%Golf %"
?

Edit: Achso... Ne, versteh' dich jetzt. Such' mal nach "Fuzzy search mysql", könnte dich weiterbringen.

Edit2: So bei genauerer Betrachtung ist dein Problem in der Tat komplex. Das V nervt. Vll. solltest du alle "Worte" die weniger als 4 Buchstaben haben einfach 'rausschneiden lassen und dann den Vergleich ausführen.
 
Zuletzt bearbeitet:
Wie ich eben gesehn habe gibts auch sehr sehr kurze Modellnamen wie etwa BJ, HD , FR etc. Also kann ich denke ich ohnehin schon froh sein, wenn ich eine Trefferquote von sagen wir 90 % erreiche.

Aber du hast mich auf eine Idee gebracht, ich kann den Fremdwert splitten und dann mit MYSQL IN suchen:

SELECT * FROM `modelle` WHERE `modell` IN('Golf', '1.6', 'Trendline');

Ist zwar nicht wirklich zufriedenstellend, da Tippfehler etc. nicht gefunden werden, aber so können denke ich die Standards schonmal mit abgedeckt werden, wenn das auf dauer nicht hinhaut muss ich mich doch mal mit FUZZY beschäftigen.
 
Die Volltextsuche sucht meines Erachtens nach aber auch genau in die falsche Richtung. Ich habe ja sozusagen einen Volltext-Suchstring und nur einen einzelnen Wert als Treffer.

Mit IN bin ich schon ein Stückchen weitergekommen, aber gleich bei den ersten Testdatensätzen bin ich wieder auf ein neues Problem gestoßen:

Ich hatte ein Modell namens "Travel King", dank des Splittens habe ich jetzt gesucht nach "Travel" und nach "King", nicht aber nach beidem zusammen. Das % aktzeptiert in leider nicht als Platzhalter. Ich bräuchte also eine Art LIKE für IN.

Selbst wenn ich neben der IN Suche noch eine Suche nach dem ganzen Datensatz einbaue bringt mir das auch nix, weil der Original String der Importdatei lautet wie folgt: "Travel King 510 TDF" ich muss aber nur das "Travel King" zum abgleich herausfiltern.
 
Ist jetzt zwar nicht die glücklichste Lösung, aber zumindest ist bei meinen bisherigen Tests die Trefferquote sehr hoch:

PHP:
$modellstrings = explode(" ",$modell);
mysql_fetch_row($dbControl->dbQry("SELECT * FROM `jos_kfz_modellreihen` WHERE 1 AND `Fahrzeugtyp` = '$typ' AND `Hersteller` = '$herstellerID' AND (`Baureihe` IN('".implode('\', \'',$modellstrings)."') OR `Baureihe` LIKE '$modellstrings[0]%') LIMIT 1"));
 
Zurück
Oben