我有一个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;
尝试使用 SOUNDEX
Soundex 键具有发音相似的单词产生的属性 相同的 Soundex 键,因此可用于简化搜索 您知道发音但不知道拼写的数据库。这 Soundex 函数返回一个 4 个字符长的字符串,以 信。
以下是关于SO的一些问题,可能会引导您朝着正确的方向前进:
- 谷歌"你的意思是吗?算法工作? 你
- 如何实现"你的意思是"?
希望这有帮助。
Soundex 可能对简单的情况有所帮助,但如果你想正确实现这样的东西,你需要一个 Lucene 搜索索引,你可以在其中执行模糊(=不精确)搜索。看看Apache Solr PHP端口。
您将需要比 LIKE 语句更复杂的东西。它显示醉酒,因为醉酒包含"醉酒"一词。
更复杂的算法会查看键盘布局以查找可能的拼写错误:例如,如果您搜索"drumk",则可以解释字母M在N旁边(在QWERTY键盘上)并建议喝醉。
如果没有结果,您也可以尝试从搜索查询中删除最后一个字符:例如:如果您搜索醉酒但找不到任何内容,则可以尝试搜索醉酒等。
希望这有帮助。
只是为了记录,我很惊讶这里没有提到 levenshtein 函数,用于测量两个字符串的"距离"或相似性,尽管对于英语单词来说,似乎没有什么能击败 soundex 类型算法或最近的 Metaphone。
通过几行代码,您将从Google之类的东西中获得"你的意思是"。请参阅 php.net 文档中的示例 #1。
请注意,此示例基于静态单词数组。如果您需要从数据库中检索这些单词,则需要再实现几行...
最简单的方法:
从 table_name 中选择 *,其中 SOUNDEX(field_name) 如 CONCAT('%', SOUNDEX('searching_element'), '%')