Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie mache ich einen Fuzzy-Match von Firmennamen in MYSQL mit PHP für die automatische Vervollständigung?

Sie können mit SOUNDEX() beginnen , wird dies wahrscheinlich für das reichen, was Sie brauchen (ich stelle mir eine automatische Vorschlagsbox mit bereits vorhandenen Alternativen für das vor, was der Benutzer eingibt).

Die Nachteile von SOUNDEX() sind:

  • seine Unfähigkeit, längere Zeichenfolgen zu unterscheiden. Es werden nur die ersten paar Zeichen berücksichtigt, längere Zeichenfolgen, die am Ende divergieren, erzeugen den gleichen SOUNDEX-Wert
  • Die Tatsache, dass der Anfangsbuchstabe gleich sein muss, sonst finden Sie nicht so einfach eine Übereinstimmung. SQL Server hat eine DIFFERENCE()-Funktion, die Ihnen sagt, wie weit zwei SOUNDEX-Werte voneinander entfernt sind, aber ich glaube, MySQL hat nichts dergleichen eingebaut.
  • für MySQL zumindest gemäß der Dokumente , SOUNDEX ist für Unicode-Eingabe defekt

Beispiel:

SELECT SOUNDEX('Microsoft')
SELECT SOUNDEX('Microsift')
SELECT SOUNDEX('Microsift Corporation')
SELECT SOUNDEX('Microsift Subsidary')

/* all of these return 'M262' */

Für fortgeschrittenere Anforderungen müssen Sie sich meiner Meinung nach die Levenshtein-Distanz ansehen (auch "Distanz bearbeiten" genannt) von zwei Saiten und arbeiten mit einem Schwellwert. Dies ist die komplexere (=langsamere) Lösung, ermöglicht aber eine größere Flexibilität.

Der Hauptnachteil ist, dass Sie beide Saiten benötigen, um den Abstand zwischen ihnen zu berechnen. Mit SOUNDEX können Sie einen vorberechneten SOUNDEX in Ihrer Tabelle speichern und danach vergleichen/sortieren/gruppieren/filtern. Bei der Levenshtein-Distanz stellen Sie vielleicht fest, dass der Unterschied zwischen „Microsoft“ und „Nzcrosoft“ nur 2 beträgt, aber es wird viel länger dauern, bis Sie zu diesem Ergebnis kommen.

Auf jeden Fall ist eine beispielhafte Levenshtein-Distanzfunktion für MySQL unter codejanitor.com zu finden:Levenshtein Distance as a MySQL Stored Function (10. Februar 2007) .