sql >> Databáze >  >> RDS >> Mysql

Jak mohu provést fuzzy shodu názvů společností v MYSQL s PHP pro automatické dokončování?

Můžete začít pomocí SOUNDEX() , pravděpodobně to bude stačit pro to, co potřebujete (představuji si pole automatického návrhu s již existujícími alternativami toho, co uživatel píše).

Nevýhody SOUNDEX() jsou:

  • jeho neschopnost rozlišit delší řetězce. Bere se v úvahu pouze prvních několik znaků, delší řetězce, které se na konci rozcházejí, generují stejnou hodnotu SOUNDEX
  • skutečnost, že první písmeno musí být stejné, jinak snadno nenajdete shodu. SQL Server má funkci DIFFERENCE(), která vám řekne, jak moc jsou dvě hodnoty SOUNDEX od sebe, ale myslím, že MySQL nemá nic takového zabudovaného.
  • pro MySQL, alespoň podle dokumenty , SOUNDEX je nefunkční pro vstup Unicode

Příklad:

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

/* all of these return 'M262' */

Pro pokročilejší potřeby si myslím, že se musíte podívat na Levenshteinovu vzdálenost (také nazývané "upravit vzdálenost") dvou strun a pracovat s prahem. Toto je složitější (=pomalejší) řešení, ale umožňuje větší flexibilitu.

Hlavní nevýhodou je, že k výpočtu vzdálenosti mezi nimi potřebujete oba řetězce. Pomocí SOUNDEX můžete uložit předem vypočítaný SOUNDEX do vaší tabulky a porovnávat/třídit/seskupovat/filtrovat podle toho. S Levenshteinovou vzdáleností možná zjistíte, že rozdíl mezi „Microsoftem“ a „Nzcrosoftem“ je pouze 2, ale k takovému výsledku bude trvat mnohem déle.

V každém případě, příklad funkce Levenshtein distance pro MySQL lze nalézt na codejanitor.com:Levenshteinova vzdálenost jako uložená funkce MySQL (10. února 2007) .



  1. Základy šifrování databáze serveru MariaDB

  2. Získání dalších řádků - Po připojení ke 3 stolům pomocí levého spojení

  3. SQL Server Nejnovější verze, edice a historie SQL Serveru

  4. Jak zjistíte velikost disku tabulky Postgres / PostgreSQL a její indexy