2012-06-01 116 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

請注意,此示例基於靜態字詞數組。如果您需要從數據庫中檢索這些單詞,則需要執行更多幾行...