2012-07-10 24 views
1

我有任務通過數據庫查找內容,即使它在搜索時被拼寫錯誤,所以我正在使用strcmp比較查詢中的soundex。問題與我目前的代碼。如果我搜索AZUS,我的意思是華碩,並且有一個華碩的頭銜,它不會顯示出來。這是因爲在post_entry華碩是<a href="">ASUS </a>所以我將不得不在soundex("%'.$arraytagsd.'")在我的代碼下面取出%做到這一點,但是對於每個選項%s%或%s或s%或s會使我的腳本變慢。MySQL查詢中的Soundex不能正常工作

有沒有辦法更快地使用soundex?

我創造了這個功能,把搜索輸入的每一個字,並將其與數據庫

$colname_getPosts = $_GET['post_title']; 
mysql_select_db($database_Main); 
function test($string) { 
    $output = ''; 
    $arrays = explode(' ', $string); 
    foreach ($arrays as $arraytagsd) { 
     $output .= ' OR strcmp(soundex(post_title), soundex("%'.$arraytagsd.'%")) = 0'; 
     $output .= ' OR strcmp(soundex(post_entry), soundex("%'.$arraytagsd.'%")) = 0'; 
     $output .= ' OR strcmp(soundex(tags), soundex("%'.$arraytagsd.'%")) = 0'; 
     $output .= ' OR strcmp(soundex(post_author), soundex("%'.$arraytagsd.'%")) = 0'; 
    } 
    return $output; 
} 

我用它在我的查詢這種種由相關

$query_getPosts = " 
SELECT post_id, post_date, post_title, post_author, post_entry, tags, sum(relevance) 
FROM (
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 10 AS relevance FROM blog_posts WHERE MATCH(post_title) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE) 
UNION 
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 2 AS relevance FROM blog_posts WHERE MATCH(post_author) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE)".test($colname_getPosts)." 
UNION 
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 5 AS relevance FROM blog_posts WHERE MATCH(post_entry) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE) 
UNION 
SELECT post_id, post_date, post_title, post_author, post_entry, tags, 7 AS relevance FROM blog_posts WHERE MATCH(tags) AGAINST('%$colname_getPosts%' IN BOOLEAN MODE))results 
GROUP BY post_id, post_date, post_title, post_author, post_entry, tags ORDER BY relevance DESC"; 
$getPosts = mysql_query($query_getPosts) or die(mysql_error()); 
$row_getPosts = mysql_fetch_assoc($getPosts); 
$totalRows_getPosts = mysql_num_rows($getPosts); 
?> 
+0

澄清:我將不得不做「%'。$ arraytagsd。'%」;然後是''。$ arraytagsd。'%'然後是'%'。$ arraytagsd。'「然後是''。$ arraytagsd。'」這會減慢腳本的速度 – kezi 2012-07-10 19:34:42

+0

'「%'。$ arraytagsd。'%」'會匹配所有4,因爲'%'匹配0個或更多字符(像正則表達式中的*),**不是** 1個或更多字符(像正則表達式中的+) – DaveRandom 2012-07-10 19:46:00

+0

......雖然說過,無論如何,'%'在soundex的上下文中是否有意義?我無法在[documentation](http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex)中的任何地方看到它...... – DaveRandom 2012-07-10 19:50:06

回答

0

你或許應該考慮使用solr爲此,但如果你想在MySQL中做到這一點,這是我會做的。

  1. 對於正在進行此搜索的列,請創建單獨的soundex列。像:product_name,product_name_soundex。
  2. 要填充product_name_soundex,你需要在代碼中做一堆東西:a)檢索產品名稱,b)標記名稱,c)爲每個標記計算soundex(但考慮使用雙重metaphone) d)將結果字符串存儲在product_name_soundex中。這可能看起來像product_name:Tonka Toy Truck product_name_soundex:T2242 T592 T2321。
  3. 在product_name上創建一個全文索引,在product_name_soundex上創建一個索引。
  4. 寫下你這樣的話,你可以像使用相同的標記和soundex algothrithms一樣構建_soundex列。