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
Tritonn
注意すべきオプション
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;
USING MECABを省略するとインデックス付け方法がNGRAM(デフォルト値)になるので注意。br
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)
インデクス生成時のオプション
NO NORMALIZE
n-gram でインデクスを生成する場合に正規化(今日=>キョウ、キョー)をしない設定。
SECTIONALIZE
NITIAL_N_SEGMENTS
mysqlがqueryを実行する時にバッファとして確保されるメモリの量。
INITIAL_N_SEGMENTS 数値のように数値を指定すると、
数値 * 256KBのサイズが確保されるようになります。
FULLTEXT INDEX USING SENNA, 2048 (text) なら 512MB
と同時に、
tablename.SEN.iファイル(多分インデクスファイル)がほぼ同量確保される(上記の例だと512MB)
インデクスファイルのデータサイズが増えると、その分のメモリが確保されるのか
メモリを何回もバッファするのかは不明。。(検証必要、 多分後者)
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
リンク =
プレゼン資料=>プレゼンの最後に「インストール後にテストするように」・・・テスト方法もある
最終更新:2010年01月25日 09:55