Tritonn って?

TritonnはMySQLから全文検索エンジンSennaを利用可能にするための改造を行うプロジェクトです。

Tritonn patch (tritonn-1.0.2)を最後に、mysqlのパッチとして提供するのをやめ、パッチが当たったmysqlを配布している模様。

Senna(せな、Senna: An Embeddable Fulltext Search Engine)は、未来検索ブラジルによって開発されているオープンソースの全文検索エンジンである。読みは「せな」であり、「せんな」ではない。検索速度が高速なことから、「音速の貴公子」と呼ばれたアイルトン・セナにちなんで名づけられた。
MeCabによる形態素解析の結果を用いた単語ベースのインデックスと、N-gramによるトークン抽出を用いたインデックスの両方を作成することができる。

インストール

環境; ubuntu 9.10

senna, mecab

senna, mecabはこのページのとおりに行えば得に問題はない。
http://qwik.jp/tritonn/howtobuild.html

Tritonn

Tritonnに関してはmysqlの公式バイナリのオプションを指定してやらないとubuntuの場合、あとあと不具合の原因になるみたい
http://d.hatena.ne.jp/makura_a/20091021

注意すべきオプション

ubuntu配布のmysql-client(/etc/mysql/my.cnf)のデフォルトの設定でmysqldのソケットファイルが/var/run/mysqld/mysqld.sockに設定されているので、Tritionnのconfigure時に以下のオプションを指定しておく
--with-unix-socket-path=/var/run/mysqld/mysqld.sock



インストール後の確認


mysqlに接続してTritonn Projectの文字が出力されてればOK
$ mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.45-modified MySQL Community Server (GPL) (portions (c) Tritonn Project)

動作確認


InnoDBとMyISAMの変換

ALTER TABLE projects TYPE="MyISAM";


でいける。逆は
ALTER TABLE projects TYPE="InnoDB";


FULLTEXT INDEX

ALTER TABLE projects ADD FULLTEXT INDEX index_description USING MECAB (description);
SHOW INDEX FROM projects;
ALTER TABLE projects DROP INDEX index_description;


または

'CREATE FULLTEXT INDEX index_description ON projects index_description USING MECAB (description);' (未確認)
SHOW INDEX FROM projects;
ALTER TABLE projects DROP INDEX index_description;

で実施するMigrationを記述。br

USING MECABを省略するとインデックス付け方法がNGRAM(デフォルト値)になるので注意。br

Ver. 1.0.7以降、デフォルトのFULLTEXTインデックスがNGRAM方式に変更。 USING句がUSING SENNAからUSING MECABに変更。
http://d.hatena.ne.jp/mir/20071020/p1

alter table の後であれば、indexが再構築され、alter table以前のデータに関してもmacthさせることが可能。

クエリーに使用されているインデクスを参照する方法
INSERT INTO projects (description) VALUES("明日の天気は晴れです。");
CREATE FULLTEXT INDEX index_description ON projects index_description (description);
ALTER TABLE projects ADD FULLTEXT INDEX index_description USING MECAB (description);
SELECT id, description FROM projects WHERE MATCH(description) AGAINST("晴れ");
=>
+----+--------------------------------------+
| id | description                        |
+----+--------------------------------------+
|  3 | 明日の天気は晴れです。 | 
+----+--------------------------------------+
1 row in set (0.00 sec)


インデクス生成時のオプション

[http://qwik.jp/tritonn/reference.html リファレンスマニュアル]

NO NORMALIZE

n-gram でインデクスを生成する場合に正規化(今日=>キョウ、キョー)をしない設定。

SECTIONALIZE

[http://d.hatena.ne.jp/mir/20070619/p1 マルチセクション機能] br
一つのtable中に複数のfulltext indexを作成する場合のオプション

NITIAL_N_SEGMENTS

mysqlがqueryを実行する時にバッファとして確保されるメモリの量。
INITIAL_N_SEGMENTS 数値のように数値を指定すると、
数値 * 256KBのサイズが確保されるようになります。
FULLTEXT INDEX USING SENNA, 2048 (text) なら 512MB

と同時に、
tablename.SEN.iファイル(多分インデクスファイル)がほぼ同量確保される(上記の例だと512MB)

インデクスファイルのデータサイズが増えると、その分のメモリが確保されるのか
メモリを何回もバッファするのかは不明。。(検証必要、 多分後者)

[http://blog.yappo.jp/yappo/archives/cat_searchdev.html ここの]2005年11月26日と2005年11月27日参照

DB変数の設定


2ind(安定度合いとしてはβ段階)

MySQLが全文検索用のインデックスと通常のインデックスの両方を併用できるようにする機能

Railsで使う


migration


  • InnoDBをMyISAMに変更
  • projects, meeting, topicsテーブルにindexを付ける

ファイル名 027_add_fulltext_index.rb
 class AddFulltextIndex < ActiveRecord::Migration
  def self.up
    # ALTER TABLE table_name TYPE = (MyISAM | InnoDB)
    alter_table_type(:users)
    alter_table_type(:projects)
    alter_table_type(:meetings)
    alter_table_type(:topics)
    # 全文検索用インデックス作成
    # CREATE FULLTEXT INDEX `pages_url_index` USING NGRAM ON pages(url(32));
    # ALTER TABLE tbl1 ADD FULLTEXT INDEX ft USING NGRAM (text);
    #remove_index(:projects, [:title])
    add_text_index(:projects, [:title])
    add_text_index(:projects, [:description])
    add_text_index(:projects, [:title, :description])
    add_text_index(:meetings, [:title])
    add_text_index(:meetings, [:description])
    add_text_index(:meetings, [:title, :description])
    add_text_index(:topics, [:title])
    add_text_index(:topics, [:content])
    add_text_index(:topics, [:title, :content])
  end

  def self.down
    remove_index(:projects, [:title])
    remove_index(:projects, [:description])
    remove_index(:meetings, [:title])
    remove_index(:meetings, [:description])
    remove_index(:topics, [:title])
    remove_index(:topics, [:content])
    alter_table_type(:users, "InnoDB")
    alter_table_type(:projects, "InnoDB")
    alter_table_type(:meetings, "InnoDB")
    alter_table_type(:topics, "InnoDB")
  end 

  private
  def self.add_text_index(table_name, column_name, options = {})
    column_names = Array(column_name)
    index_name   = index_name(table_name, :column => column_names)  

    if Hash === options # legacy support, since this param was a string
      index_name = options[:name] || index_name
    else
      index_type = options
    end
    quoted_column_names = column_names.map { |e| quote_column_name(e) }.join(", ")
    execute "ALTER TABLE #{quote_table_name(table_name)} ADD FULLTEXT INDEX      #{quote_column_name(index_name)} USING MECAB (#{quoted_column_names})" 
  end
  def self.alter_table_type(table_name, table_type="MyISAM")
    execute "ALTER TABLE #{table_name} TYPE = #{table_type}"
  end
 end


リンク =

Tritonnページ内のリンク=>インストール、チュートリアル

プレゼン資料=>プレゼンの最後に「インストール後にテストするように」・・・テスト方法もある
最終更新:2010年01月25日 09:55