【问题标题】:search suggestion - PHP - MySQL搜索建议 - PHP - MySQL
【发布时间】:2012-06-01 12:02:45
【问题描述】:

我有一个如下的 MySQL 查询;

$query = "SELECT * FROM dictionary WHERE word LIKE '%".$word."%' ORDER BY word LIMIT 10";

这将在我的字典数据库中搜索(并显示)单词。

搜索将返回;

Drunken for Drunk, etc, etc.. , Drunken for Drunke, etc, etc..Drunken for Drunken, etc, etc..

但它不会为 Drunkin 返回 Drunken。我想将这个词显示为建议词(就像我们在谷歌中看到的那样)。我该怎么做?

以下是我的完整代码供参考;

$db = new pdo("mysql:host=localhost;dbname=dictionary", "root", "password");
$query = "SELECT * FROM dictionary WHERE word LIKE '%".$word."%' ORDER BY word LIMIT 10";
$result = $db->query($query);
$end_result = '';
if ($result) {
    while ( $r = $result->fetch(PDO::FETCH_ASSOC) ) {
        $end_result .= $r['word'].'<br>';
    }
}
echo $end_result;

【问题讨论】:

  • 一旦到达 i 字符,它就不再匹配。您可以在查询中使用子字符串来使查询更通用。 substr('$word, 0, 5) 会给你 Drunk 这会让你 Drunkin 在你的结果集中。

标签: php mysql search pdo search-suggestion


【解决方案1】:

尝试使用 SOUNDEX

Soundex 键具有发音相似的单词产生的属性 相同的 soundex 键,因此可用于简化搜索 您知道发音但不知道拼写的数据库。这 soundex 函数返回一个 4 个字符长的字符串,以 a 开头 信。

以下是一些关于 SO 的问题,可能会引导您朝着正确的方向前进:

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    Soundex 可能对简单的情况有所帮助,但如果您想正确实现类似的功能,您需要一个 Lucene 搜索索引,您可以在其中执行模糊(=不精确)搜索。看看Apache Solr PHP port

    【讨论】:

      【解决方案3】:

      您将需要一些比 LIKE 语句更复杂的东西。它显示 Drunken for Drunk 因为 Drunken 包含 Drunk 一词。

      更复杂的算法会查看键盘布局中可能存在的拼写错误:例如,如果您搜索“drumk”,您可能会解释为字母 M 位于 N 旁边(在 QWERTY 键盘上)并建议喝醉。

      如果没有结果,您也可以尝试从搜索查询中删除最后一个字符: 例如:如果你搜索drinke没有找到,你可以尝试搜索drinke等等。

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        只是为了记录,我很惊讶这里没有提到 levenshtein 函数,用于测量两个字符串的“距离”或相似度,尽管对于英语单词来说似乎没有什么比soundex 类型算法,或者最近的 Metaphone。

        只需几行代码,您就可以从 Google 之类的东西中获得“您的意思是”。请参阅 php.net 文档中的 example #1

        请注意,此示例基于单词的静态数组。如果您需要从数据库中检索这些单词,则需要再实现几行...

        【讨论】:

          【解决方案5】:

          最简单的方法:

          SELECT * FROM table_name WHERE soundex(field_name) LIKE CONCAT('%', soundex('searching_element'), '%')

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-25
            • 1970-01-01
            • 2013-01-13
            • 1970-01-01
            • 1970-01-01
            • 2011-04-04
            • 1970-01-01
            相关资源
            最近更新 更多