我的用户将通过剪切导入并粘贴包含公司名称的大字符串。
我有一个公司名称的现有且不断发展的MYSQL数据库,每个数据库都有一个唯一的company_id。
我希望能够解析字符串并为每个用户输入的公司名称分配模糊匹配。
现在,仅进行直线字符串匹配也很慢。 Soundex索引编制会更快吗?我如何在用户输入时给他们一些选择?
例如,某人写道:
微软->微软 裸机必备->裸机必备 Polycom,Inc.-> Polycom
我发现以下线程似乎与此问题相似,但是发布者尚未批准,并且不确定它们的用例是否适用:
如何在大型字符串数据库中找到字符串的最佳模糊匹配
在Java中匹配不精确的公司名称
您可以从开始使用SOUNDEX(),这可能会满足您的需要(我为用户键入的内容提供了一个自动建议框,其中包含已有的替代方案)。
SOUNDEX()
的缺点SOUNDEX()是:
例:
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日)。