一尘不染

如何在MYSQL中使用PHP对公司名称进行模糊匹配以实现自动完成?

mysql

我的用户将通过剪切导入并粘贴包含公司名称的大字符串。

我有一个公司名称的现有且不断发展的MYSQL数据库,每个数据库都有一个唯一的company_id。

我希望能够解析字符串并为每个用户输入的公司名称分配模糊匹配。

现在,仅进行直线字符串匹配也很慢。 Soundex索引编制会更快吗?我如何在用户输入时给他们一些选择?

例如,某人写道:

微软->微软
裸机必备->裸机必备
Polycom,Inc.-> Polycom

我发现以下线程似乎与此问题相似,但是发布者尚未批准,并且不确定它们的用例是否适用:

如何在大型字符串数据库中找到字符串的最佳模糊匹配

在Java中匹配不精确的公司名称


阅读 295

收藏
2020-05-17

共1个答案

一尘不染

您可以从开始使用SOUNDEX(),这可能会满足您的需要(我为用户键入的内容提供了一个自动建议框,其中包含已有的替代方案)。

的缺点SOUNDEX()是:

  • 它无法区分较长的字符串。仅考虑前几个字符,结尾处较长的较长字符串会产生相同的SOUNDEX值
  • 第一个字母必须相同,否则您将很难找到匹配的事实。SQL Server具有DIFFERENCE()函数来告诉您两个SOUNDEX值相隔多少,但是我认为MySQL并没有内置任何此类值。
  • 对于MySQL,至少根据docs,SOUNDEX对于unicode输入已损坏

例:

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

/* all of these return 'M262' */

对于更高级的需求,我认为您需要查看两个字符串的Levenshtein距离(也称为“编辑距离”)并使用阈值。这是较复杂(较慢)的解决方案,但它具有更大的灵活性。

主要缺点是,您需要两个字符串来计算它们之间的距离。使用SOUNDEX,您可以将预先计算的SOUNDEX存储在表中,然后在该表上进行比较/排序/分组/过滤。使用Levenshtein距离,您可能会发现“
Microsoft”和“ Nzcrosoft”之间的差异仅为2,但是要花费更多的时间才能得出该结果。

无论如何,可以在codejanitor.com上找到MySQL的示例Levenshtein距离函数:作为MySQL存储函数的Levenshtein距离(2007年2月10日)

2020-05-17