0

我有一个如下的 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..

但它不会返回DrunkenDrunkin我想将这个词显示为建议词(就像我们在谷歌中看到的那样)。我怎样才能做到这一点?

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

$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;
4

5 回答 5

3

尝试使用SOUNDEX

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

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

希望这可以帮助。

于 2012-06-01T12:07:54.820 回答
1

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

于 2012-06-01T12:13:12.593 回答
0

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

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

如果没有结果,您也可以尝试从搜索查询中删除最后一个字符:例如:如果您搜索醉酒但没有找到任何内容,您可以尝试搜索醉酒等。

希望这可以帮助。

于 2012-06-01T12:09:55.113 回答
0

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

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

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

于 2015-01-29T14:38:42.997 回答
-1

最简单的方法:

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

于 2013-10-01T13:34:52.290 回答