2016-06-29 13 views
0

MySQLの私のft_min_word_lenは4に設定されています.2文字または3文字のフルテキスト検索をしようとすると、結果は得られません。だから私はこれらの短い言葉の全文検索を取得するには、このコードを使用しています:ft_min_word_lenの下の文字でMySQL(PHP)の全文検索

$table = $this->db->shop_products(); 

$where = ''; 
preg_match_all("~[\\pL\\pN_]+('[\\pL\\pN_]+)*~u", stripslashes($find), $matches); 

foreach($matches[0] as $part) { 
    $isFirst = empty($where); 
    $regexp = "REGEXP '" . addslashes($part) . "'"; 

    if(!$isFirst) $where .= " AND ("; 
    $where .= "name {$regexp} OR content {$regexp}"; 
    if(!$isFirst) $where .= ")"; 
} 

return $table->where($where)->limit(5)->fetchAll(); 

このコードは正常に動作しますが、それはč, á, é, í...のように、発音区別符号に問題があります。たとえば、という商品があります。ちょうどbeで検索したいときは、同じ文字がないので、その商品は表示されません。

注:私は、MySQLのクエリのNotORMを使用していますが、私はあなたが$table->where(...ことを仕事ん方法を知っている願っています。

+0

なぜ「ft_min_word_len」を2に設定しないのですか? – Solarflare

+0

私のウェブサイトでは、私はそのようなことはできません。 – debute

答えて

0

私は解決策を見つけましたが、MySQLではなくPHPで解決しました。 foreachの中に私はこの行を$part = diagriticToNormal($part);と置いています。それで、特殊文字を古典的な文字に変えたり、名前を付ける方法を変えたりします。この答えの下にその機能があります。私はそれが不足していることを知っている、パフォーマンスなどのために良い...しかし、それは十分です。

function diagriticToNormal($text) { 
    $charsMap = array(
     'a' => array('á', 'ä'), 
     'c' => array('č'), 
     'd' => array('ď'), 
     'e' => array('é', 'ě'), 
     'i' => array('í'), 
     'l' => array('ľ', 'ĺ'), 
     'n' => array('ň'), 
     'o' => array('ô', 'ó'), 
     'r' => array('ŕ', 'ř'), 
     's' => array('š'), 
     't' => array('ť'), 
     'u' => array('ú', 'ů'), 
     'y' => array('ý'), 
     'z' => array('ž'), 
    ); 

    foreach($charsMap as $real => $alt) { 
     $alt = implode('|', $alt); 
     $text = str_replace(array(strtolower($real), strtoupper($real)), '[' . $real . '|' . $alt . ']', $text); 
    } 

    return $text; 
}