PHP / MySQL小规模模糊搜索

时间:2009-12-16 13:30:50

标签: php mysql search fuzzy-search

我正在寻找一个小型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本身做不可能,但由于数据集非常有限,我想保持它相对简单...也许是一个获得所有使用某种比较算法,并返回相似记录的ID?

谢谢, 杰森

2 个答案:

答案 0 :(得分:7)

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

但是,如何选择一个可管理规模的候选人名单来排名呢?

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

this thread上查看建议的答案。它非常整洁,应该可以很好地处理不大的数据库。

答案 1 :(得分:3)

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

Imho它的效果非常好。看一下示例实现here。我知道该搜索使用相同的算法,它可以很好地找到'Nintedno'。它还会根据您的查询最匹配的结果为您排序结果。