Veröffentlicht 11. Februar 200619 j Hallo zusammen, ich bin gerade dabei ein Such Modul für meine Webseite zu bauen. Jetzt steh ich vor dem SQL den ich dazu benötige. Ich möchte diesen so gestalten, dass auch bei kleineren Tippfehlern ein "gutes" Ergebnis erscheint. Ursprünglich sah mein SQL so aus: SELECT id FROM rex_article WHERE ( name LIKE "%'. $search .'%" or catname LIKE "%'. $search .'%" or keywords LIKE "%'. $search .'%" or descriptionLIKE "%'. $search .'%" ) AND clang='. $REX['CUR_CLANG'] .' LIMIT 40 Jetzt wollte ich via Soundex diese "Tippfehlerkorrektur" einbauen SELECT id FROM rex_article WHERE ( SOUNDEX(name) = SOUNDEX("'. $search .'") or SOUNDEX(catname) = SOUNDEX("'. $search .'") or SOUNDEX(keywords) = SOUNDEX("'. $search .'") or SOUNDEX(description) = SOUNDEX("'. $search .'") ) AND clang='. $REX['CUR_CLANG'] .' LIMIT 40 Leider findet meine Suche mit Soundex noch weniger, als nur mit LIKE... Wo ist mein Denkfehler in der Geschichte? Muss ich das Soundex auch noch irgendwie mit einem LIKE kombinieren? Viele Grüße, Markus
13. Februar 200619 j Leider findet meine Suche mit Soundex noch weniger, als nur mit LIKE... Wo ist mein Denkfehler in der Geschichte? Muss ich das Soundex auch noch irgendwie mit einem LIKE kombinieren? Viele Grüße, Markus Das Problem ist das Soundex den ersten Buchstaben nicht als Zahl darstellt sondern als Buchstabe. soundex('Hello'); ergibt also H400 Wenn jetzt aber in einer deiner Spalten die du durchsuchts das 'Hello' nicht gerade am Anfang steht wird es vollständig als Zahl repräsentiert. Somit solltest du den Buchstaben bei deiner Suche nicht berücksichtigen. Außerdem empfehle ich auch hier einen LIKE String vergleich weil sonst die Texte absolut identisch sein müssten
13. Februar 200619 j Das Problem ist das Soundex den ersten Buchstaben nicht als Zahl darstellt sondern als Buchstabe. [...] Außerdem empfehle ich auch hier einen LIKE String vergleich weil sonst die Texte absolut identisch sein müssten Das ist kein Problem, sondern der Standard Soundex-Algorithmus Und das LIKE ist eigentlich nicht nötig, weil er ja Soundex verwendet. (siehe hier). MySQL Soundex verwendet aber nicht nur 4 Zeichen Soundex-Code, sondern beliebig lange Codes (Also wirklich jeden Buchstaben im Wort ersetzen, aber min. 4 Zeichen lang. Friseur und Friseurin ergeben also bei MySQL M626 und M6265). ... SUBSTRING(SOUNDEX(name), 1, 4) = SUBSTRING(SOUNDEX(search), 1, 4) ... sollte das Problem beheben.
14. Februar 200619 j Hi zusammen, Danke für die Mühe! ... SUBSTRING(SOUNDEX(name), 1, 4) = SUBSTRING(SOUNDEX(search), 1, 4) ... Das kann doch so gar nicht gehen oder? Mein Feld indem ich suche ist vom Type TEXT. Mit den o.g. SOUNDEX geht es doch nur, wenn die ersten 4 Zeichen des Strings dem Suchstring entsprechen oder? Gruß, Markus
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.