目次

MySQL :: Senna + Tritonn のインストール

インストールの流れ

  1. グループ mysql とユーザ mysql を追加する
  2. MeCab 0.81以降のインストール
  3. MeCab 用の辞書 (IPA 辞書)のインストール
  4. Senna のインストール
  5. Tritonn (MySQL バインディング)のインストール
    1. 動作確認
    2. 自動起動の設定
  6. Sennaの設定と動作確認
    1. logディレクトリ と 設定ファイル
    2. 動作確認
  7. 付録. Tr-itonn の既知の不具合・制限事項を確認


1. グループ mysql とユーザ mysql を追加する

存在しなければ、グループ mysql とユーザ mysql を追加する。
なお、configure で特に指定しなければ MySQLのデータディレクトリは /usr/local/var になる。
ここでは /home/mysql にする。

% sudo groupadd mysql -g 3306
% sudo useradd -u 3306 -g mysql -d /home/mysql mysql

mysqlユーザのホームディレクトリとデータディレクトリを作成

% sudo mkdir -p /home/mysql/data; sudo chown -R mysql:mysql /home/mysql


2. MeCab 0.81以降のインストール

今回は MeCab 0.96 を使用

ソースURL)
http://downloads.sourceforge.net/mecab/mecab-0.96.tar.gz?modtime=1181487226&big_mirror=0

% cd /usr/local/src
% wget "http://downloads.sourceforge.net/mecab/mecab-0.96.tar.gz?modtime=1181487226&big_mirror=0"
% tar xzf mecab-0.96.tar.gz
% rm -f mecab-0.96.tar.gz
% cd mecab-0.96

–prefix オプションで「stow」でディレクトリを指定
–with-charset オプションで「utf8」を指定

% ./configure --prefix=/usr/local/stow/mecab-0.96 --with-charset=utf8
% make
% sudo make install

stow

% cd /usr/local/stow
% sudo stow mecab-0.96


3. MeCab 用の辞書 (IPA 辞書)のインストール

ソースURL)
http://downloads.sourceforge.net/mecab/mecab-ipadic-2.7.0-20070801.tar.gz?modtime=1185895550&big_mirror=0

% cd /usr/local/src
% wget "http://downloads.sourceforge.net/mecab/mecab-ipadic-2.7.0-20070801.tar.gz?modtime=1185895550&big_mirror=0"
% tar xzf mecab-ipadic-2.7.0-20070801.tar.gz
% rm -f mecab-ipadic-2.7.0-20070801.tar.gz
% cd mecab-ipadic-2.7.0-20070801

–prefix オプションで「stow」でディレクトリを指定
–with-charset オプションで「utf8」を指定

% ./configure --prefix=/usr/local/stow/mecab-ipadic-2.7.0-20070801 --with-charset=utf8
% make
% sudo make install

restow

% cd /usr/local/stow
% sudo stow -R mecab-0.96


4. Sennaのインストール

今回は Senna 1.0.9 を使用

ソースURL)
http://prdownloads.sourceforge.jp/senna/27317/senna-1.0.9.tar.gz

% cd /usr/local/src
% wget "http://osdn.dl.sourceforge.jp/senna/27317/senna-1.0.9.tar.gz"
% tar -xzf senna-1.0.9.tar.gz
% rm -f senna-1.0.9.tar.gz
% cd senna-1.0.9

–prefix オプションで「stow」でディレクトリを指定

% ./configure --prefix=/usr/local/stow/senna-1.0.9
% make
% sudo make install

stow

% cd /usr/local/stow
% sudo stow senna-1.0.9


5. Tritonn (MySQL バインディング)のインストール

Tritonnとは
 TritonnはMySQLから全文検索エンジンSennaを利用可能にするための改造を行うプロジェクトです。
 MySQLにSenna(およびMeCab)を組み込んだバイナリをリリースしており、誰でも簡単にMySQLでの
  日本語全文検索を利用できるようになっています。

引用:http://qwik.jp/tritonn/about.html


今回は mysql-5.0.45-tritonn-1.0.7 を使用

ソースURL)
http://osdn.dl.sourceforge.jp/tritonn/27837/mysql-5.0.45-tritonn-1.0.7.tar.gz

% cd /usr/local/src
% wget "http://osdn.dl.sourceforge.jp/tritonn/27837/mysql-5.0.45-tritonn-1.0.7.tar.gz"
% tar -xzf mysql-5.0.45-tritonn-1.0.7.tar.gz
% rm -f mysql-5.0.45-tritonn-1.0.7.tar.gz
% cd mysql-5.0.45-tritonn-1.0.7
% ./configure \
--with-named-curses-libs=/lib/libncurses.so.5 \
--prefix=/usr/local/stow/mysql-5.0.45-tritonn-1.0.7 \
--localstatedir=/home/mysql/data \
--with-charset=utf8 \
--with-collation=utf8_general_ci \
--with-extra-charsets=all \
--with-mysqld-user=mysql \
--with-readline \
--enable-thread-safe-client \
--enable-local-infile \
--enable-assembler \
--with-pic \
--with-fast-mutexes \
--with-client-ldflags=-static \
--with-mysqld-ldflags=-static \
--with-zlib-dir=bundled \
--with-big-tables \
--with-yassl \
--with-archive-storage-engine \
--with-blackhole-storage-engine \
--with-ndbcluster \
--with-csv-storage-engine \
--with-example-storage-engine \
--with-federated-storage-engine \
--with-innodb \
--with-senna \
--with-mecab
--with-named-curses-libs
 Debian の場合のみ必要

--prefix オプションで「stow」でディレクトリを指定
 インストールPATH

--localstatedir
 データのパス

-with-unix-socket-path
 ソケットのパス

--with-charset オプションで「utf8」を指定
 デフォルトで使用される文字コードを指定。EUCならujis、Shift-JISならsjis。

--with-extra-charsets オプションで「all」を指定
 デフォルトで指定された文字コード以外をサポートしたい場合の指定。
 "--with-extra-charset=ujis,sjis,..."のように個別に指定可能だが、
 ここでは“all”とします。このオプションを指定することで、makeをやり直さなくても、
 異なる文字コードでサーバを起動することができる。 

--with-mysqldオプションで「mysql」を指定
 MySQLデーモンを起動するユーザーの指定。

--with-readline
 mysqlクライアントで日本語入力ができるようにする

:
:
:

--with-senna を指定

--with-mecab を指定
% make
% sudo make install

destow & stow

% cd /usr/local/stow
# もし、他ヴァージョンのmysqlがインストールされている場合は「stow -D」する
% sudo stow -D mysql-5.0.33 
% sudo stow mysql-5.0.45-tritonn-1.0.7

次に、データベースを初期化。

% cd 『展開されたソースが格納されたディレクトリ』
% sudo -u mysql scripts/mysql_install_db

設定ファイル /etc/my.cnf を用意。
(ここでは標準的な設定ファイルを使用するが、用途に応じて my-huge.cnf、my-large.cnf、my-small.cnf のどれかを選択)

% sudo cp support-files/my-medium.cnf /etc/my.cnf

my.cnf の修正。
下記では、デフォルトのテーブルタイプを「InnoDB」、デフォルトの文字コードを「UTF-8」に設定(追加)。

[mysqld]
 :
default-table-type=InnoDB
default-character-set=utf8
 :

必要であれば[mysqldump]セクションにも追加。

[mysqldump]
 :
default-character-set=utf8
 :

[mysqldump]セクションに追加した場合は、mysqlコマンドだけでなくmysqladminにも影響する。
5.0ではmysqladminでエラーが発生するようです。


Ⅰ. 動作確認

MySQL を起動

% sudo /usr/local/bin/mysqld_safe --user=mysql &

設定項目の一覧を見る

% sudo mysqladmin variable

パスワード設定

% sudo mysqladmin -u root password パスワード

ログイン

% mysql -u root -p
Enter password: 設定したパスワード

show databases; してみる

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)

動作確認が完了したらMySQLを終了

% mysqladmin -u root shutdown -p


Ⅱ. 自動起動の設定

まず、rcスクリプトを用意。
展開されたソースの support-files にrcスクリプトのひな型 mysql.server があるので、これを使用。
mysql.server を mysql という名前でコピーし、実行権限を与える。

% cd support-files
% sudo cp -p mysql.server mysql
% sudo chmod +x mysql

/etc/init.d にrcスクリプトを移動。

% sudo mv mysql /etc/init.d/

/etc/rc2.d/ にシンボリックリンクを張る。

% cd /etc/rc2.d/
% sudo ln -s ../init.d/mysql S90mysql

自動起動の確認。
一旦、システムを落として、mysqldが正常に自動起動するかどうか確認する。

% sudo shutdown -r now


6. Sennaの設定と動作確認

logディレクトリ と 設定ファイル

senna.log は /var/senna/logディレクトリの有無で ON/OFF される

% cd /var; sudo mkdir -p senna/log; sudo chown -R mysql:mysql senna

senna.confで文字コードの設定を行う

% sudo -u mysql vi /var/senna/senna.conf
DEFAULT_ENCODING utf8

上記、ログ設定または文字コード設定を行った場合は、mysql を再起動する

% sudo /etc/init.d/mysql restart


動作確認

% mysql -u root -p
mysql> create database senna_test;
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| senna_test         |
| test               |
+--------------------+
4 rows in set (0.01 sec)

テーブル「table01」をsenna_testに作成

mysql> use senna_test;
mysql> CREATE TABLE table01 (
    id INT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY(id),
    title VARCHAR(255),
    body TEXT,
    FULLTEXT(body)
) Type=MyISAM;

以下のようなテキストファイル「insert.utf8.dml」を作成してサーバに scp する。
エンコーディングは「utf-8」、改行は「LF」。

insert.utf8.dml

INSERT INTO table01 VALUES
(NULL, "衆院選挙について", "皆さんはどの党に投票するのでしょうか"),
(NULL, "果物", "apple リンゴ、orange オレンジ"),
(NULL, "歌", "わくわくさせてよ、ついてるねのってるね"),
(NULL, "MySQL", "MySQLリファレンスマニュアルを全部読め"),
(NULL, "ロボットのgood designとは", "先週末に開催された GoodDesignPresentation 2005");

dml を実行

% mysql -u root -p senna_test < insert.utf8.dml

インサートされたか確認

% mysql -uroot senna_test -e 'select * from table01;' -p
id      title   body
1       衆院選挙について        皆さんはどの党に投票するのでしょうか
2       果物    apple リンゴ、orange オレンジ
3       歌      わくわくさせてよ、ついてるねのってるね
4       MySQL   MySQLリファレンスマニュアルを全部読め
5       ロボットのgood designとは       先週末に開催された GoodDesignPresentation 2005

セレクトとアップデートの確認用ファイルも scp する。

select.utf8.dml (セレクト確認用)

SELECT * FROM table01 WHERE MATCH(body) AGAINST('投票');
SELECT * FROM table01 WHERE MATCH(body) AGAINST('投票する');
SELECT * FROM table01 WHERE MATCH(body) AGAINST('apple');
SELECT * FROM table01 WHERE MATCH(body) AGAINST('リンゴ');
SELECT * FROM table01 WHERE MATCH(body) AGAINST('わくわく');
SELECT * FROM table01 WHERE MATCH(body) AGAINST('gooddesign');
SELECT * FROM table01 WHERE MATCH(body) AGAINST('読め');

update.utf8.dml (アップデート確認用)

UPDATE table01 SET body = 'wakuwakusaseteyo,ついてるねのってるね' WHERE id = 3;
SELECT * FROM table01 WHERE MATCH(body) AGAINST('wakuwaku');
UPDATE table01 SET body = 'わくわくさせてよ、ついてるねのってるね' WHERE id = 3;
SELECT * FROM table01 WHERE MATCH(body) AGAINST('わくわくさせてよ');
UPDATE table01 SET body = 'グッドデザイン'  WHERE id = 5;
SELECT * FROM table01 WHERE MATCH(body) AGAINST('グッドデザイン');
UPDATE table01 SET body = 'good design 2005'  WHERE id = 5;
SELECT * FROM table01 WHERE MATCH(body) AGAINST('design');
UPDATE table01 SET body = 'read mysql reference manual'  WHERE id = 4;
SELECT * FROM table01 WHERE MATCH(body) AGAINST('manual');

セレクトの確認

% mysql -u root -p senna_test < select.utf8.dml
id      title   body
1       衆院選挙について        皆さんはどの党に投票するのでしょうか
id      title   body
1       衆院選挙について        皆さんはどの党に投票するのでしょうか
id      title   body
2       果物    apple リンゴ、orange オレンジ
id      title   body
2       果物    apple リンゴ、orange オレンジ
id      title   body
3       歌      わくわくさせてよ、ついてるねのってるね
id      title   body
5       ロボットのgood designとは       先週末に開催された GoodDesignPresentation 2005
id      title   body
4       MySQL   MySQLリファレンスマニュアルを全部読め 

アップデートの確認

% mysql -u root -p senna_test < update.utf8.dml
id      title   body
3       歌      wakuwakusaseteyo,ついてるねのってるね
id      title   body
3       歌      わくわくさせてよ、ついてるねのってるね
id      title   body
5       ロボットのgood designとは       グッドデザイン
id      title   body
5       ロボットのgood designとは       good design 2005
id      title   body
4       MySQL   read mysql reference manual

SEN.* 系の senna独自のインデックスファイルが生成されているか確認

% sudo ls -la /home/mysql/data/senna_test
total 152
drwx------  2 mysql mysql    4096 Nov 27 20:40 .
drwxr-sr-x  5 mysql mysql    4096 Nov 27 20:37 ..
-rw-rw----  1 mysql mysql      61 Nov 27 19:23 db.opt
-rw-rw----  1 mysql mysql 8462336 Nov 27 20:40 table01.001.SEN
-rw-rw----  1 mysql mysql 1740800 Nov 27 20:40 table01.001.SEN.i
-rw-rw----  1 mysql mysql  135168 Nov 27 20:40 table01.001.SEN.i.c
-rw-rw----  1 mysql mysql 8462336 Nov 27 20:40 table01.001.SEN.l
-rw-rw----  1 mysql mysql     392 Nov 27 20:52 table01.MYD
-rw-rw----  1 mysql mysql    2048 Nov 27 20:52 table01.MYI
-rw-rw----  1 mysql mysql    8618 Nov 27 20:40 table01.frm


EXPLAIN で fulltextインデックスが利用されているか確認

mysql> EXPLAIN SELECT * FROM table01 WHERE MATCH(body) AGAINST('') \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: table01
         type: fulltext
possible_keys: body
          key: body
      key_len: 0
          ref:
         rows: 1
        Extra: Using where
1 row in set (0.01 sec) 


7. 付録. Tritonnの既知の不具合・制限事項を確認

http://qwik.jp/tritonn/known_bugs.html

以下、抜粋。

MyISAMテーブルのみが対象
 InnoDBは未サポートです。

デフォルトのエンコーディングはEUC
 変更する場合は、 /var/senna/senna.conf というファイルに、
  DEFAULT_ENCODING 値
 のように指定して下さい。 (値はeuc, sjis, utf8, defaultのいずれか)

レプリケーション、IN BOOLEAN MODEには対応しています。
 レプリケーション環境でも動作いたします。

検索速度を速くするために。
 全文検索処理が高速に終わっても、出力するための処理に時間を要している場合がよくあります。
 このケースについては、limit 0, 10 などのように、出力行数を制限すると飛躍的に
 応答が速くなります。
 また、大量のレコードに対してcount(*)などを行った際、インデックスを用いることが
 できないためクエリ速度が大幅に遅くなることがあります。
 mysql_bindingを参考に、2ind-patchを適用ください。

optimize table実行後は明示的なインデックス再構築が必要
 optimize tableを実行したあとには、以下のいずれかの操作を行ってください。
 ・一旦fulltext indexをdropし、再度 create indexを行う
 ・MySQLサーバを終了させ、myisamchk -rでインデックスの再構築を行う

Sennaのインデックス形式が変わった場合にはインデックス再構築が必要
 異なるメジャーバージョン間でのインデックスファイルの互換性は保障されていません。
 以下のいずれかの操作を行ってください。
 ・一旦fulltext indexをdropし、再度 create indexを行う
 ・MySQLサーバを終了させ、myisamchk -rでインデックスの再構築を行う

[不具合]MySQLバインディングにおいて、alter table時にインデックス作成時のフラグが反映されない
 例えば、SennaによるNGRAMインデックスを作成したテーブルに対して、
 新たにフィールドをalter tableで加えたとしましょう。
 この場合、MySQLは全てのインデックスを作成しなおします。
 その際に、Sennaのインデックス作成時に指定したフラグの内容が失われてしまいます。
 Sennaのデフォルトのフラグの値は、 MeCabを用いたインデックス・文字列を正規化しない
 インデックスとなっているため、--without-mecabの環境や、文字列を正規化したい場合に問題が
 生じてしまいます。
 alter tableを実行する場合には、あらかじめSennaのインデックスをdrop indexで削除した上、 
 alter tableを実行後、
 再度Sennaのインデックスを作成してください。