itoigawabass

itoigawaのブログ

MySQL Full-Text Search

2014-08-22

全文検索がどんなものか試してみた。しかし思うように検索されない

SELECT * FROM `blog` WHERE MATCH (title,contents) AGAINST ('word' IN BOOLEAN MODE) ORDER BY `date` DESC

テーブルの内容は日本語の文章で英語のようにスペース区切りが少ない。これにFULLTEXTインデックスを付けても単語としてのインデックスは少ないことになる。
なので単語での検索はヒットされにくい、と思った。
試しに文章の単語をスペースで区切ってから検索してみると思うようにヒットした。

これなら全文検索より LIKE '%word%' で検索したほうが良い。

スペース区切りの複数の単語から検索するphpのスクリプト

$wsql = "";
if($searchtxt){
 $count = 1;
 $searchtxt = trim($searchtxt);	 //前後のスペースを取り除く
 $searchtxt = str_replace(" "," ",$searchtxt);	//全角スペースがあれば、半角スペースに変換
 if(stristr($searchtxt, " ")){		//もし半角スペースが間にあれば検索文字列を分解する
  $word = explode(" ", $searchtxt);
  $count = count($word);				//配列の数をカウントしておく
 }else{
  $word[0]=$searchtxt;
 }
 
 //空スペースで区切られた数によってSQL文を組み立てる
 for($i = 0; $i<$count; $i++){		 //配列の数だけ繰り返す
  if($i!="0"){
   $wsql = $wsql." OR";
  }
  $wsql = $wsql." title LIKE '%{$word[$i]}%' or contents LIKE '%{$word[$i]}%'";	
 }
}
$sql = "SELECT * FROM `blog` WHERE {$wsql} ORDER BY `date` DESC";

2014-08-22 08:18:54

カテゴリー:mysql
タグ: