今までなんとなく使ってきた MySQL の FULLTEXT インデックスカラムを検索する方法を少し調べてみましたのでまとめておきます。
基本的な検索方法
本文を全文検索する場合は以下です。
1 | SELECT * FROM articles WHERE MATCH (body) AGAINST ('MySQL'); |
タイトルを本文など複数カラムを検索する場合は以下です。
1 | SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL'); |
関連データを検索する「クエリ拡張」
これについては以下のページが参考になりました。
- floatingdays: MySQLの FULLTEXTインデックスと MATCH AG…
- MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.7.2 クエリ…
- MySQL :: MySQL 5.1 リファレンスマニュアル (オンラインヘルプ) :: 7.8.1 自然言語フルテキスト検索
ブラインド クエリ拡張 ( 自動関連フィードバックとも言う ) は、検索フレーズの後に WITH QUERY EXPANSION または IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION を加えることによって有効になります。
以下のように加えることで有効になるようです。
1 2 | SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL' WITH QUERY EXPANSION); |
ひとつ言えることとしては、日本語はスペース区切りではないため、関連といってもあまり有効活用できないのかもしれないですね。もし使う場合は Ngram を使った検索をすると思うので、IN BOOLEAN MODE の方がお世話になりそうです。
ブール全文検索について
IN BOOLEAN MODE 修飾子を使用して、ブール全文検索を行えます。
通常は以下のような仕様ですが。
該当データが全体の50%を超えるような単語は検索対象から除外
ブール全文検索についてはこの 50% の境界値を用いず、先ほど紹介した検索とは違い、Google 検索のように細かい演算子でキーワードを指定して検索することができます。以下がサンプルコードです。
1 2 | SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL +PHP' IN BOOLEAN MODE); |
Ngram などの時にはこちらが役立ちます。また、FULLTEXT インデックスを活用して、タグをスペース区切りで格納している場合などには、この方法でデータを抜き出すことができそうです。
コメント