Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço uma correspondência difusa de nomes de empresas em MYSQL com PHP para preenchimento automático?


Você pode começar usando SOUNDEX() , isso provavelmente servirá para o que você precisa (imagino uma caixa de sugestão automática de alternativas já existentes para o que o usuário está digitando).

As desvantagens de SOUNDEX() estão:
  • sua incapacidade de diferenciar strings mais longas. Apenas os primeiros caracteres são levados em consideração, strings mais longas que divergem no final geram o mesmo valor SOUNDEX
  • o fato de que a primeira letra deve ser a mesma ou você não encontrará uma correspondência facilmente. O SQL Server tem a função DIFFERENCE() para informar o quanto dois valores SOUNDEX estão separados, mas acho que o MySQL não tem nada desse tipo embutido.
  • para MySQL, pelo menos de acordo com o documentos , SOUNDEX está quebrado para entrada unicode

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

/* all of these return 'M262' */

Para necessidades mais avançadas, acho que você precisa ver a distância de Levenshtein (também chamado de "editar distância") de duas strings e trabalhar com um limite. Esta é a solução mais complexa (=mais lenta), mas permite maior flexibilidade.

A principal desvantagem é que você precisa de ambas as cordas para calcular a distância entre elas. Com o SOUNDEX você pode armazenar um SOUNDEX pré-calculado em sua tabela e comparar/classificar/agrupar/filtrar nele. Com a distância Levenshtein, você pode descobrir que a diferença entre "Microsoft" e "Nzcrosoft" é de apenas 2, mas levará muito mais tempo para chegar a esse resultado.

Em qualquer caso, um exemplo de função de distância Levenshtein para MySQL pode ser encontrado em codejanitor.com:Distância Levenshtein como uma função armazenada do MySQL (10 de fevereiro de 2007) .