【问题标题】:PHP/MySQL small-scale fuzzy searchPHP/MySQL 小范围模糊搜索
【发布时间】:2009-12-16 13:30:50
【问题描述】:

我希望为小型 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 类,得到 all 来自数据库的记录,使用某种比较算法,并返回相似记录的 ID?

谢谢, 杰森

【问题讨论】:

    标签: php mysql search fuzzy-search


    【解决方案1】:

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

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

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

    this thread 上查看建议的答案。它非常简洁,应该适用于不是很大的数据库。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-01
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-01
        相关资源
        最近更新 更多