2009-12-16 6 views
5

Ich suche nach Fuzzy-Suche für eine kleine PHP/MySQL-Anwendung zu implementieren. Insbesondere habe ich eine Datenbank mit etwa 2400 Datensätzen (Datensätze mit einer Rate von etwa 600 pro Jahr hinzugefügt, so ist es eine kleine Datenbank). Die drei Interessengebiete sind Straße, Nachname und Datum. Ich möchte in der Lage sein, nach einem dieser Felder zu suchen und im Wesentlichen Toleranz für Rechtschreib-/Zeichenfehler zu haben. dh eine Adresse von "123 Main Street" sollte auch mit "123 Main St", "123 Main St.", "123 Mian St", "123 Man St", "132 Main St" usw. übereinstimmen und ebenfalls nach Namen und Datum.PHP/MySQL kleine unscharfe Suche

Die wichtigsten Fragen, die ich mit Antworten auf ähnliche Fragen haben:

  • Es ist unmöglich, Synonyme für jede mögliche falsche Schreibweise zu definieren, vergessen so für Daten und Namen zu tun.
  • Lucene usw. scheint sehr schwer für solch eine begrenzte Suchdatenmenge (nennen Sie es maximal 5.000 Datensätze, 3 Felder pro Datensatz).
  • Nur etwas mit Platzhaltern zu tun scheint nicht logisch mit allen möglichen Rechtschreibfehlern.

Irgendwelche Vorschläge? Ich weiß, dass es nicht möglich ist, nativ mit MySQL zu arbeiten, aber da die Datenmenge so begrenzt ist, möchte ich es relativ einfach halten ... vielleicht eine PHP-Klasse, die alle der Datensätze aus Die Datenbank verwendet eine Art Vergleichsalgorithmus und gibt die IDs der ähnlichen Datensätze zurück.

Danke, Jason

Antwort

7

Razzies Antwort (oder Damerau–Levenshtein) sortiert eine Liste von Kandidaten nach ihrer Nähe zum Suchschlüssel. (Pass auf: wenn der Schlüssel "12 Main St" ist, dann hat "13 Main St" die gleiche Tippdistanz wie "12 Moin St", aber du möchtest es vielleicht niedrig klassifizieren oder sogar ausschließen, wie bei 11 und 22 Main St etc.)

Aber wie wählen Sie eine Liste von Kandidaten mit einer überschaubaren Größe zu ranken?

Eine Möglichkeit besteht darin, den Metaphonwert (oder die Werte, die ein Doppelmetaphon verwenden) für jedes Wort in den zu suchenden Strings zu berechnen. Speichern Sie jedes dieser Metaphone in einer anderen Tabelle mit der ID der Zeile, die die ursprüngliche Zeichenfolge enthält. Sie können dann diese Metaphonwerte schnell mit LIKE 'key%' suchen, wobei key das Metaphon eines Wortes aus dem Suchtext ist.

Überprüfen Sie die vorgeschlagene Antwort auf this thread. Es ist ziemlich ordentlich und sollte gut für DBs funktionieren, die nicht riesig sind.

3

Wenn es sich um eine sehr kleine Datenbank, Sie konnte Last alle Daten auf einmal und einen Algorithmus wie Jaro-Winkler für Ihre Suche verwenden. Sie haben eine Implementierung in PHP, die Sie finden können here.

Imho funktioniert es wirklich gut. Sehen Sie sich eine Beispielimplementierung an: here. Ich weiß, dass diese Suche den gleichen Algorithmus verwendet und "Nintedno" sehr gut findet. Es sortiert auch die Ergebnisse für Sie, basierend darauf, welches Ergebnis am besten zu Ihrer Anfrage passt.