Sven Rautenberg: Wie unterscheidet man bei Suche ob1 oder 2 Worte etc

Beitrag lesen

Moin!

mal eine ganz blöde Frage:

Das ist absolut keine blöde Frage, sondern eine der kompliziertesten, die man sich so vorstellen kann.

Ich  habe eine Suchfunktion in der man beliebige Wörter eingeben kann.
Die Suche soll in einer Datenbank Personen finden.

Computer können auf "einfache" Weise nur identische Bytes finden. Alles, was darüber hinaus geht, muß ihnen aufwendig beigebracht werden. Und "suchen, wie ein Mensch simpel sucht" ist definitiv sehr aufwendig.

Die Datenbankfelder in denen gesucht wird sind
"Vorname" "Name" und "falsche Schreibweise" (als Suchhilfe: da steht z.B. statt Hans Müller dann Hans Muller oder Hans Müler oder so etwas in der Art - macht bei diesem Beispiel nicht wirklich sinn aber aber es gibt einige Namen di prinzipiell falsch geschrieben werden...)

Gerade diese "Falsche Schreibweise" ist doch das komplizierte. Natürlich kannst du da eine eigene Spalte definieren und dort auch exakt EINE falsche Schreibweise eintragen - aber Menschen sind kreativ, gerade bei Tippfehlern.

Was das entdecken von ähnlich klingenden Namen angeht, bieten sowohl PHP als auch MySQL ein paar Funktionen an. Beide kennen z.B. die soundex-Funktion (http://de.php.net/soundex), PHP noch ein paar weitere, die sich auf "Textähnlichkeit" beziehen.

Wie kann ich das schreiben, daß alle Fälle berücksichtigt werden, wie muß ich den übergebenen String aufdröseln?

Da bist du voll gefordert. Ein Suchstring ist für den Computer erstmal nur eine Abfolge von Zeichen.

Es ist komplett DEINE Aufgabe, dem Suchstring einen Sinn zu geben. Beispielsweise zu erkennen, dass ein Leerzeichen drin steht, welches du vielleicht als Worttrennzeichen betrachten willst. Oder das Pluszeichen - was soll das machen? Anführungszeichen um die Worte - was sollen die bewirken?

Diesen Vorgang, aus einem Text für den Computer einen Sinn herauszulesen, nennt man "parsen" - und das ist eine der aufwendigen Arbeiten beim Suchen.

Wie schaffe ich aber die Unterscheidung ob nur ein oder Zwei Wörter enthalten sind, bzw. ob die Wörter mit + oder - Verbunden sind oder ob die Wörter in Anführngszeichen stehen..

Analysiere den Suchstring, gib ihm "Sinn", und ermittle, was genau gesucht werden soll.

Gibt es für so was fertige Scripts? Gibt es bei der Suchfunktion noch andere Sachen die ich beachten muß? Wie sieht es bei Sonderzeichen aus wie Umlauten, AKzenten, oder diese netten Dänischen kombinationen von z.B. ae als einen Buchstaben? Muß ich diese alle vor der Suche bzw. in der Datenbank umwandeln oder werden solche Sachen automatisch trotzdem gefunden?

Du darfst davon ausgehen, dass du komplett alles selbst machen mußt. Willst du beispielsweise erlauben, dass der Benutzer nach "Mueller" suchen darf, und auch "Müller" finden soll, mußt du der Suche beibringen, dass ein "ü" auch als "ue" gefunden werden kann. In der Datenbank den Namen als "Mueller" eintragen geht allerdings ja nicht, weil dort - so nehme ich an - die Originalnamen stehen müssen. Das gleiche gilt auch für alle Akzentzeichen, die auch ohne Akzent gesucht werden könnten, sowie natürlich auch mit dem "falschen" Akzent, und im Prinzip gleichbedeutend behandelt werden, wie die Grundzeichen ohne Akzent.

Es gibt natürlich auch fertige Suchmaschinen. Die haben allerdings meist eine gezielte Aufgabenstellung, also beispielsweise indizieren sie die gesamte Website, und bieten dafür dann eine Suche an. Siehe z.B. "htdig". Das kannst du für deine Datenbank nicht verwenden, weil du ja keine "Webseiten" suchen kannst, sondern Namen suchst.

Soviele Fragen und so wenig Ahnung...

Du hast dir mit so einer Suche definitiv eine der kompliziertesten Aufgaben ausgesucht. Es ist alles andere als einfach.

Ich würde empfehlen, klein anzufangen. Erstmal Beschränkungen auferlegen: Suche nur nach genau EINEM Namen, und die Suche findet dann auch nur exakte Übereinstimmungen in der Schreibweise. Davon ausgehend kann man dann Ergänzungen schreiben, also beispielsweise eine unscharfe Suche nach dem Namen einbauen, oder den Suchstring komplizierter werden lassen.

- Sven Rautenberg

--
My sssignature, my preciousssss!