2011-03-10 28 views
0

我正在使用MySQL全文搜索IN BOOLEAN MODE,但遇到搜索字符串中的數字值問題,由於在my.cnf中設置的ft_min_word_len設置的字符限制限制(目前在此服務器上設置爲3)。是否有任何解決方法,以便像「東西14」這樣的搜索將搜索「東西」和「14」(甚至是「十四」),因爲當前字符限制意味着忽略3位數以下的數字。由於搜索字符串中的數字片段很重要,因此我們需要將ft_min_word減少爲1以確保所有搜索都返回正確的結果,這會使索引極其緩慢。一個可能的解決方案是使用PHP替換數字和他們相同的單詞,並確保這個單詞也被添加到可搜索的文本中,但這感覺很不好。MySQL全文搜索 - 解決方法爲數值和ft_min_word_len

還有其他想法嗎?

回答

1

是的,我在幾年前遇到了這個問題,並一直在爲我的客戶使用此解決方案。就結果而言,它使事情工作得很好。

基本上它將3個字符以下的任何內容分成LIKE搜索和任何超過3個字符的全文布爾搜索。我目前正在發佈我的分層搜索版本。但直到我完成。我發佈了全文部分,以便您可以使用代碼。如果你有任何問題或做得更好。我只是要求你將它發佈在我的Project Hosted網站上,以便它變得更好。

完整的功能顯示在源鏈接。

$parseQuery = explode(" ",$query); 
foreach($parseQuery as $key => $qvalue) 
{ 
     if(strlen($qvalue) > 3) 
     { 
       $buildQuery .= "$qvalue "; 
     } 
     elseif(strlen($qvalue) >= 2) 
     { 
       $buildLike[] = "`blog` LIKE '%$qvalue%'"; 
     } 
} 

if($buildLike != "") 
{ 
$numCountQuery = 0; 
     $countforbuilding = count($buildLike) - 1; 
     foreach($buildLike as $key => $queryforLike) 
     { 
       if($numCountQuery != $countforbuilding) 
       { 
         $finalBuildLike .= "$queryforLike AND"; 
       } 
       else 
       { 
         $finalBuildLike .= "$queryforLike"; 
       } 
       $numCountQuery++; 
     } 
} 
if(($finalBuildLike != "") && ($buildQuery != "")) 
{ 
$finalBuildLike = "AND $finalBuildLike"; 
} 

if($buildQuery != "") 
{ 
$buildDescription = $buildQuery; 
$buildQuery = "MATCH(blog) AGAINST ('".trim($buildQuery)."')"; 
} 

http://code.google.com/p/php-mysql-layered-search/

希望這有助於。

+0

感謝您的輸入,但我不太喜歡這個解決方案,因爲切換到LIKE將徹底改變結果集 – robjmills 2011-03-29 15:16:14

+0

沒有問題。我也這樣想過,直到我把它作爲測試並看到報告。看起來邏輯上不可能認爲mysql可以從一個角色產生一個好的布爾分數,但總是有更好的方法。讓我知道你發現了什麼。 – RichardW11 2011-03-29 20:46:26