MySQLで全文検索

MySQL全文検索しようと思い立った。
というのは、自作サイトでタグとコメント欄の全文検索を行いたくなったからだ。

MySQLは日本語の全文検索に対応できていない。

MySQLはバージョン5.0の時点では英文の全文検索にしか対応していない。
日本語で全文検索を行うには、外部ツールの助けが必要になる。
その外部ツールとして senna がある。
sennaを使えばMySQLで日本語の全文検索が可能になる。
しかしsennaは純粋なライブラリである。MySQLからそれを利用するにはMySQLコンパイルして、sennaを組み込む必要がある。この手間を省くべく、tritonnというソフトウェアが存在する。
今回はこのtritonnを利用して、MySQLでの全文検索を利用可能にした。

今回の手順概略

  • インストール済みの MySQLパッケージを削除
  • senna 組込み済みの MySQLをインストール
  • DBのテーブルに FULLTEXT インデックスを追加

インストール済みの MySQLパッケージを削除

利用している ubuntuには、apt-get install で MySQLパッケージを導入していた。
これとtritonnがぶつかるので、以下のパッケージを削除した。

例:

apt-get remove mysql-client-5.0

senna 組込み済みの MySQLをインストール

すごく丁寧な説明がここにある。
http://qwik.jp/tritonn/installtarball.html
このとおりにやれば、問題なし。

DBのテーブルに FULLTEXT インデックスを追加

以下のようにして、テーブルにFULLTEXTインデックスを追加した。

class CreateVideoItems < ActiveRecord::Migration
  def self.up
    create_table (:video_items, :options => "ENGINE MyISAM  DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci") do |t|
      t.string :vid
      t.string :title
      t.text :my_comment
      t.text :tags
      t.string :thumbnail_url

      t.timestamps
    end
    add_index :video_items, :vid, :unique=>true
    execute "CREATE FULLTEXT INDEX idx_my_comment ON video_items(my_comment)"
    execute "CREATE FULLTEXT INDEX ids_tags ON video_items(tags)"
  end

  def self.down
    drop_table :video_items
  end
end

以下の点に注意。

  • エンジンを MyISAMに指定する(InnoDBでは全文検索できない)。
  • execute メソッドで FULLTEXT インデックスを作成する。

動作確認

ここに素晴らしいチュートリアルがある。
http://qwik.jp/tritonn/basictutorial.html
このとおりにして動作を確認した。

いやー、疲れた。