Fuzzy Logic: "ungefähre Suche" oder: Wie wird Hase zu Hose!
Charles Darwin
- php
Hallo
Ich habe eine Suchfunktion die einfach über SQL eine DB abfrage macht.
Nun sind die Produkte in der Datenbank die Angeboten werden nicht mit einem genauen Namen betitelbar (aua) weil sie reginal unterschiedlich sind.
So gibt es ein Produkt das manche Cantine und mache Kantine und mache Kantiene nennen (die Wörter gibt es nicht im Duden, es sind Szenewörter).
Nun meine Frage: Gibt es die Möglichkeit den Suchbegriff einem chekc zu unterwerfen?
Sprich: schreibt jemand Katine:
Dieser Eintrag brachte keine Ergebnisse!
Meinen sie vielleicht Canttine
So dass ich eben ein Schlüsselwort erstellen welches auch bei anderen schreibweisen benutzt wird?
Perfekt wäre es natürlich dynamisch dass PHP sieht "Ach! Das gibt es nicht.. aber ich habe ein Wort was so ÄHNLICH ist"... aber sowas wie Fuzzy Logic traue ich php nicht zu! =)
Antworten? =)
ciao
Hallo charles,
So gibt es ein Produkt das manche Cantine und mache Kantine und mache Kantiene nennen (die Wörter gibt es nicht im Duden, es sind Szenewörter).
Nun meine Frage: Gibt es die Möglichkeit den Suchbegriff einem chekc zu unterwerfen?
suchst du:
http://www.selfphp.net/selfphp/funktionsreferenz/string_funktionen/soundex.html?
Grüße,
Jochen
Holladiewaldfee,
suchst du:
http://www.selfphp.net/selfphp/funktionsreferenz/string_funktionen/soundex.html?
Naja ... ich finde da
http://www.php.net/soundex
nützlicher, schon allein wegen der Kommentare.
Aber bringen wird ihm das nicht viel, weil er ja eigentlich ein datenbankseitiges Problem hat. Natürlich kann er jedesmal den gesamten Satz aus der Datenbank auslesen und dann stückweise mit soundex() durchrattern ... was aber ab einer gewissen Größe nicht mehr wirklich performant ist.
Wenn er MySQL > 4.1 nutzen sollte (was ich irgendwie für unwahrscheinlich halte) könnte er es mit einer Konstruktion wie
SELECT id FROM tabelle WHERE schluesselwort SOUNDS LIKE 'blahr';
verwenden. Drunter (4.0 hab ich überprüft, 3.x weiß ich nicht) muß man halt
SELECT id FROM tabelle WHERE SOUNDEX(schluesselwort)=SOUNDEX('blahr');
schreiben. Auf jeden Fall hat man das Problem damit schonmal auf die Datenbank verlagert. Insgesamt glaube ich natürlich nicht, daß dieser SoundEx-Kram wirklich performant ist. Ich würde eher zu jedem Schlüsselwort den SoundEx-Wert schon in der Tabelle mitspeichern, um ihn nicht jedesmal neu berechnen zu müssen.
Natürlich kann er auch den ganzen Weg "zu Fuß" machen und einfach "Gruppen" definieren, die jeweils verschiedene Ausdrücke zusammenfassen und dann jeweils die ganzen Gruppen abfragen.
Ciao,
Harry
Holla Harry,
suchst du:
http://www.selfphp.net/selfphp/funktionsreferenz/string_funktionen/soundex.html?Naja ... ich finde da
http://www.php.net/soundex
nützlicher, schon allein wegen der Kommentare.
Ich kenne nur soundex, nicht PHP. Und den Link hat mir Google verraten.
Ich würde eher zu jedem Schlüsselwort den SoundEx-Wert schon in der Tabelle mitspeichern, um ihn nicht jedesmal neu berechnen zu müssen.
ja, genau so machen wir es auch. (Institut -> Bankleitzahl) Die soundex-Werte der Banken liegen mit in der Datenbank. Den soundex-Algorithmus habe wir in C implementiert. Jetzt nur noch aus der Usereingabe den Wert errechnen und ein einfacher select liefert eine mehr oder weniger passende Auswahl.
Grüße,
Jochen