5

我正在寻找为小型 PHP/MySQL 应用程序实现模糊搜索。具体来说,我有一个包含大约 2400 条记录的数据库(以每年大约 600 条的速度添加记录,因此它是一个小型数据库)。感兴趣的三个字段是街道地址、姓氏和日期。我希望能够通过其中一个字段进行搜索,并且基本上可以容忍拼写/字符错误。即,“123 Main Street”的地址也应与“123 Main St”、“123 Main St.”、“123 Mian St”、“123 Man St”、“132 Main St”等匹配,名称也是如此和日期。

我对其他类似问题的回答的主要问题:

  • 不可能为每个可能的错误拼写定义同义词,忘记为日期和名称定义同义词。
  • Lucene 等对于这样一个有限的搜索数据集(称其最多为 5,000 条记录,每条记录 3 个字段)而言似乎非常重量级。
  • 对于所有可能的拼写错误,仅仅使用通配符做一些事情似乎并不合乎逻辑。

有什么建议么?我知道不可能在本地使用 MySQL,但由于数据集非常有限,我想保持相对简单......也许是一个 PHP 类,它可以从数据库中获取所有记录,使用某种比较算法,并返回相似记录的 ID?

谢谢,杰森

4

2 回答 2

7

Razzie 的答案(或使用Damerau–Levenshtein)根据与搜索键的接近程度对候选匹配列表进行排名。(请注意:如果键是“12 Main St”,则“13 Main St”与“12 Moin St”具有相同的打字距离,但您可能希望将其排在低位甚至排除它,就像 11 和 22 Main St ETC。)

但是,您如何选择一个规模可控的候选人列表进行排名呢?

一种方法是为要搜索的字符串中的每个单词计算变音位值(或值,使用双变位音位)。将这些变音位中的每一个保存在另一个表中,并使用包含原始字符串的行的 id。然后,您可以使用 LIKE 'key%' 快速搜索这些变音位值,其中 key 是搜索文本中单词的变音位。

查看此线程上的建议答案。它非常整洁,应该适用于不是很大的数据库。

于 2009-12-17T23:09:56.100 回答
4

如果它是一个非常小的数据库,您可以一次加载所有数据并使用Jaro-Winkler 之类的算法进行搜索。他们有一个 PHP 实现,你可以在这里找到。

恕我直言,它真的很好用。看看这里的示例实现。我知道该搜索使用相同的算法,并且可以很好地找到“Nintedno”。它还会根据与您的查询最匹配的结果为您排序结果。

于 2009-12-16T13:38:01.350 回答