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

Textsuche: Begriffe welche so ähnlich geschrieben werden wie der Suchbegriff

petz_e

New member
Hi,

OK, folgendes. Ich habe ein Suchfeld das eine Datenbank durchsucht. Im Moment wird die Eingabe mit zwei Universalzeichen versehen:
Code:
WHERE NAME LIKE '%$name%'
Aber die Suche sollte auch Wörter finden welche dem Suchbegriff sehr nahe liegen. So sollte man bei 'Weber' auch 'Webber' finden, oder bei 'Stul' auch 'Stuhl'. So eine Suche stelle ich mir sehr, sehr kompliziert vor. Aber dafür gibt es bestimmt schon fertige Scripts.

Aber wie heisst so eine Suche überhaupt. Nach was sucht man da im Internet?

Patrick
 
Wahrscheinlich eher weniger...

Wenn ich dich richtig verstanden habe, meinst du etwas wie das "Meinen Sie"-Feature von Google?
Google hat hierfür ein riesiges Wörterbuch zur Verfügung mit dem es jeden Suchbegriff abgleicht und auf phonetische Ähnlichkeiten überprüft (hierfür gibt es auch in PHP built-in Algorithmen wie zum Beispiel metaphone()), sollte der Begriff nicht im Wörterbuch als solches auftreten.
Aber auch Google kann es sich nicht leisten bei jeder Abfrage alle Begriffe durchzugehen, daher generiert Google die Lauthashes schon im Voraus.

Was das für dich heisst: Erstelle (vll. über ein PHP-Script) eine Tabelle mit zwei Spalten, eine für den Lautschlüssel eines Namens und die andere für den Identifier eines Namens (damit du auch weisst zu welchem Namen der Lautschlüssel gehört). Den Lautschlüssel kannst du wie schon erwähnt mit metaphone() oder auch soundex() generieren (SOUNDEX() gibt es auch in mySQL).
Nach einer Abfrage eines Users überprüfst du natürlich ob es den Namen in der Datenbank gibt, und wenn nicht generierst du einen Lautschlüssel für die Usereingabe und suchst diesen in der Lautschlüsseltabelle. Findest du da eine Übereinstimmung kannst du durch den Identifier auf den Namen schliessen.

Das wäre ein möglicher Ansatz...

Grüsse
jeko
 
Aus der MySQL Dokumentation habe ich folgendes:

"This function, as currently implemented, is intended to work well with strings that are in the English language only. Strings in other languages may not produce reliable results."

D.h. für Namen ist diese Funktion eher nicht geeignet?

Patrick
 
D.h. für Namen ist diese Funktion eher nicht geeignet?

Das ist natürlich eines der grossen Probleme dieser Lautfunktionen, sie rechnen meist mit englischem Input. Du hast nun zwei Möglichkeiten: Selber eine Lautfunktion für die deutsche Sprache schreiben oder einmal versuchen nur mit soundex() auszukommen; probier's mal und sollten die Resultate nicht zufriedenstellend sein, kannst du deinen Algorithmus auch erweitern, beispielsweise um Ähnlichkeitsprüfungen mit similar_text() oder levenshtein(). In der Praxis bewährt sich eine Kombination aus Laut- und Ähnlichkeitsprüfung, aber ob man beides wirklich braucht findet man halt nur mit testen heraus.

Edit: Von einem Mischen der Funktionen verschiedener Implementierungen ist jedoch abzuraten.
D.h. wenn du soundex()-Hashes von den bestehenden Daten mit mySQL SOUNDEX() generierst, dann generiere bitte auch den Soundex des Inputs des Benutzers mit mySQL SOUNDEX() und nicht mit PHP soundex().
Der Grund ist der, dass mySQL und PHP den Soundexalgorithmus leicht abweichend implementiert haben und so unter Umständen Kuriositäten wie PHP_soundex('foo') != mySQL_soundex('foo') -> true auftreten.

Dagegen sollte PHP_soundex('foo') != PHP_soundex('foo') und mySQL_soundex('foo') != mySQL_soundex('foo') jeweils zu false evaluieren.
 
Zuletzt bearbeitet:
Zurück
Oben