当前位置: 首页 > 面试题库 >

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

步骏
2023-03-14
问题内容

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

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

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

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

例如,某人写道:

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

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

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

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


问题答案:

您可以从开始使用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日)。



 类似资料:
  • 下面列出XML布局 我想实现排序功能,在那里用户可以排序公司名称升序和降序,我如何实现它?

  • 问题内容: 我刚刚开始探索Elasticsearch。我创建了一个文档,如下所示: 我现在尝试对Levenshtein距离为5的名称字段进行模糊搜索,如下所示: 但是它没有返回任何匹配。我希望圣路易斯的记录能归还。我该如何解决我的查询? 谢谢。 问题答案: 您的查询存在的问题是,最大编辑距离为2。 在上述情况下,您可能想要做的是将St.改为Saint 的同义词,这将与您匹配。当然,这将取决于您的数

  • 问题内容: 我已经在线阅读了文档和各种教程,但是我对regex在Java中的工作方式仍然感到困惑。我正在尝试做的是创建一个接受字符串类型参数的函数。然后,我想检查传递的字符串是否包含MDCLXVIivxlcdm以外的任何字符。因此,例如,字符串“ XMLVID​​”应返回false,而“ ABXMLVA”应返回true。 当我通过时,“ XMLIVD”,“ ABXMLVA”和“ XMLABCIX”

  • 问题内容: 当我尝试使用自动加载和命名空间时出现此错误: 致命错误:* 在 第10行的 /usr/local/www/apache22/data/public/php5.3/test.php中 找不到类’Class1’ * 谁能告诉我我在做什么错? 这是我的代码: Class1.php: test.php: 问题答案: Class1不在全局范围内。 请参见下面的工作示例: 编辑(2009-12-1

  • 我相信这并不难,但我自己似乎想不出来。 然后再次执行时,它将是类似name4、name1、name2、name5等等的内容......

  • 本文向大家介绍在MySQL中搜索多列以进行行匹配,包括了在MySQL中搜索多列以进行行匹配的使用技巧和注意事项,需要的朋友参考一下 为此,请使用UNION。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是搜索多列的查询- 这将产生以下输出-