存在しなければ、グループ 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
今回は 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
% 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
今回は 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
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
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)
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のインデックスを作成してください。