2012-06-01 87 views
0

我有一个MySQL查询如下;搜索建议 - PHP - MySQL

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

这将搜索(并显示)我的字典db中的单词。

该搜索将返回;

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

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

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

$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; 
+0

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

回答

0

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

更复杂的算法会查看可能的拼写错误的键盘布局:例如,如果搜索'drumk',则可以将字母M与N(在QWERTY键盘上)旁边的内容解释为“醉”。

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

希望这会有所帮助。

1

Soundex可能对于简单情况有所帮助,但是如果您想要正确实施此类功能,则需要一个Lucene搜索索引,您可以在其中执行模糊(=非条理)搜索。看看Apache Solr PHP port

-1

最简单的方法:

SELECT * FROM table_name的WHERE同音(FIELD_NAME)LIKE CONCAT( '%',SOUNDEX( 'searching_element'), '%')

0

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

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

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