FC2ブログ

スポンサーサイト

-------- --:--:-- --

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【Linux】MySQLで全文検索【MySQL】

2011-09-29 23:13:37 Thu

概要


MySQLで全文検索を行う際、sennaを使用するとデータ量が増加しても
パフォーマンスを維持しつつ検索処理を行うことができる。
このsennaをMySQLから利用できる環境を構築する手順。

なお、MySQLはTritonnで提供されているものを利用し、
ソースからビルドしていく。

※個人的なスキルの問題ですが、Linux周りがあまり詳しくないので試行錯誤しながらやりました。
 仕組みを理解している人にすると無駄な手順や実行ファイルなどの格納場所など標準的なものから逸脱しているかもしれません。

■OS
CentOS-5.7-i386

■tritonn(mysql)
tritonn-1.0.12-mysql-5.0.87.tar.gz

■senna
senna-1.1.5.tar.gz

■mecab
mecab-0.98.tar.gz
mecab-ipadic-2.7.0-20070801.tar.gz


手順に行く前に…。
私の理解もまだ浅いのですが、上記、それぞれなぜインストールするかというと。

OSは言うまでもないですね。

●tritonn(mysql)
これはMySQLを全文検索エンジンSennaを利用するためにソースレベルで変更したものです。
既存のMySQLがあればポートわけたりインストールディレクトリをわけたりPATHをわけたりすればいいみたいなのですが、僕にはわからないので既存のMySQLとは重複しない形でインストールすることにします。

●senna
これは全文検索エンジン本体です。

●mecab
日本語文字から分かち書きインデックスを作成するための形態素解析エンジンです。
sennaのみでは、英語しか全文検索できないようです。
なお、mecab-ipadicというのは日本語の辞書ファイルです。
mecab単体で利用するよりもこの辞書を別途用意したほうが良いようです。

手順


※root権限でインストールを行うこと


su -



◯ターボールを移動

mv tritonn-1.0.12-mysql-5.0.87.tar.gz /usr/local/src/
mv senna-1.1.5.tar.gz /usr/local/src
mv mecab-ipadic-2.7.0-20070801.tar.gz /usr/local/src/
mv mecab-0.98.tar.gz /usr/local/src/



◯ターボールを移動したディレクトリへ移動

cd /usr/local/src/



◯mecabのインストール

tar xzf mecab-0.98.tar.gz
cd mecab-0.98
./configure --prefix=/usr/local/mecab-0.98 --with-charset=utf8
make
make install



◯mecabのシンボリックリンク作成

ln -sfn /usr/local/mecab-0.98 /usr/local/mecab



◯mecabのipac辞書作成

tar xzf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801
./configure --prefix=/usr/local/mecab --with-charset=utf8 --with-mecab-config=/usr/local/mecab/bin/mecab-config
make
make install



◯sennaのインストール

tar xzf senna-1.1.0.tar.gz
cd senna-1.1.0
./configure --prefix=/usr/local/senna-1.1.0 --with-mecab-config=/usr/local/mecab/bin/mecab-config
make
make install



◯sennaのシンボリックリンク作成

ln -sfn /usr/local/senna-1.1.0 /usr/local/senna



◯tritonnのインストール

tar xzf tritonn-1.0.9-mysql-5.0.51a.tar.gz
cd tritonn-1.0.9-mysql-5.0.51a
./configure --prefix=/usr/local/tritonn-1.0.9-mysql-5.0.51a --with-senna=/usr/local/senna --with-mecab=/usr/local/mecab --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql
make
make install



◯tritonnのシンボリックリンク作成

ln -sfn /usr/local/tritonn-1.0.9-mysql-5.0.51a /usr/local/mysql



◯ビルドしたMySQLの初期設定

cd /usr/local/mysql

./bin/mysql_install_db --user=mysql

groupadd mysql
useradd mysql -g mysql

chown -R root /usr/local/mysql
chown -R mysql /usr/local/mysql/var
chown -R mysql /usr/local/mysql

ln -s /usr/local/mysql/bin/mysqld_safe /usr/local/bin/mysqld_safe
ln -s /usr/local/mysql/bin/mysqladmin /usr/local/bin/mysqladmin
ln -s /usr/local/mysql/bin/mysql /usr/local/bin/mysql

cp /usr/local/src/tritonn-1.0.12-mysql-5.0.87/support-files/my-medium.cnf /etc/my.cnf



次に「vi /etc/my.cnf」として設定ファイルを編集します。各セクションにて「default-character-set=utf8」を追加します。これにより、MySQLの処理を行うときはUTF-8で使うように統一しています。

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysqld]
default-character-set=utf8
これでmy.cnfを保存します。


cp /usr/local/src/tritonn-1.0.12-mysql-5.0.87/support-files/mysql.server /etc/rc.d/init.d/mys

chmod 755 /etc/rc.d/init.d/mysqld

chkconfig --add mysqld



MySQLサーバサービスの起動と停止
以下でサービスを起動します。


/etc/rc.d/init.d/mysqld start


以下でサービスを停止します。


/etc/rc.d/init.d/mysqld stop


以下でサービスを再起動します。


/etc/rc.d/init.d/mysqld restart


MySQLのrootユーザのパスワードを指定
mysqld(MySQLのサービス)を起動した状態で以下を実行することにより、MySQLのrootユーザのパスワードを指定します。


mysqladmin -u root password xxxx


ここでは、パスワードを「xxxx」に設定していることになります。

これでインストール作業はすべて完了です。

キャラクタセットの確認
mysqldが起動している状態で、「mysql」を実行してMySQLのコマンドラインに移動してください。

◯全文検索のチェック

mysql -u root -p


この後、rootユーザのパスワードを聞いてきます。上記で設定したパスワードを入力します。

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 73 to server version: 4.1.10a-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>
みたいに出れば成功です。

ここで「show variables like 'char%';」と入力してください。以下のように表示されましたか?

+--------------------------+----------------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/mysql/charsets/ |
+--------------------------+----------------------------------------+
すべてがUTF-8になっているのが分かります。これで、MySQLを使う上で 文字コードをUTF-8で統一してIn/Outすることにより、文字化け不都合および多言語対応ができます。

クライアント・サーバのキャラクタセットが統一されていないと文字化けする原因になりますので、これはよく確認するようにしてください。

mysqlクライアント起動

mysql -u root
mysql>
起動したことを確認。

データベース作成

mysql> create database senna_test;
データベース作成されたことを確認。

mysql> show databases;
+--------------+
| Database |
+--------------+
| mysql |
| senna_test |
| test |
+--------------+
3 rows in set (0.00 sec)
テーブルの作成

以下のテーブルをsenna_testに作成


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


INSERTの確認

以下のようなファイル(insert_to_table)から、table01にレコード登録


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


mysql -u root < insert_to_table
全文検索WHERE MATCHの確認

以下のようなファイル(search)から、検索動作を確認。


use senna_test;
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('読め');


mysql -u root < search
英語、日本語とも検索できた。

UPDATEの確認

以下のようなファイル(upd_and_search)からレコードの更新と検索の動作を確認。


use senna_test;
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 < upd_and_search
更新、検索とも正しく動作した。


参考URL
http://honana.com/mysql/tritonn/mecab.html
http://ft-lab.ne.jp/cgi-bin/wiki.cgi?page=MySQL%A4%F2%A5%BD%A1%BC%A5%B9%A4%AB%A4%E9%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB%A1%CARedHat9%A1%CB
http://qwik.jp/senna/check_install.html

スポンサーサイト

⇒comment

Secret

名言集
全記事(数)表示
全タイトルを表示
ブログ内検索
Loading
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。