MySQL対応全文検索システム
Mroonga(むるんが)
作成者:小越 秀
作成日:2014年9月29日
Mroongaとは
• インストールしたら、後は普通のMySQLとして
使える日本語に対応した唯一の全文検索シ
ステム
• 全文検索エンジンにTritonnの後継プロダクト
Groonga(ぐるんが)を使用
• MySQLのプラグインとして動作する
(MySQL5.1以降のプラガブルストレージエン
ジンを使用し、MySQLのバイナリに手を加え
ず動的にロードして利用可能)
• http://mroonga.org/ja/
Mroongaの特徴
• 更新内容をすぐに検索可能
• 更新中に検索性能を落とさない(更新時の排他表ロックがない)
• 高速な位置情報検索
• 日本語対応(collationの設定でひらがな、カタカナ、全角、半角の
違いを吸収できる)
• 形態素解析、N-gram、空白区切りなどのパーサーがある
• ラッパーモードを使用することで、MyISAMやInnoDBなどのストレー
ジエンジンに全文検索機能だけを追加できる
• 毎月アップデートがリリースされていて、活動が活発(最新リリース
は2014年9月29日)
• OSSで開発されているため、特定の企業の動向に依存しにくい
(https://github.com/mroonga)
全文検索システム
プロダクト名 全文検索エンジン 備考
Tritonn Senna
MySQL5.0まで対応
ストレージエンジンは
MyISAMのみ対応
Mroonga Groonga
Tritonnの後継プロダクト
MySQL5.1以降に対応
GroongaにMySQLストレー
ジエンジンを実装したもの
ストレージエンジンは
InnoDBにも対応
Mroongaを使わない場合
1. アプリ側で前処理(トークナイズ処理)をして
MyISAM/InnoDBの全文検索機能を使用する
2. Solr/Sphinxなどの別の全文検索システムを
使用する
一手間余計にかかって開発が面倒。運用も
MySQLと全文検索システムの2つを見なくては
ならない。
Mroongaのモード
1. ストレージモード(トランザクション非対応)
2. ラッパーモード(トランザクション対応。
MyISAMやInnoDBに全文検索機能だけを追
加するモード。MySQLのプラガブルストレー
ジエンジンを使用し、既存のストレージエン
ジンを変更しない。)
サポートしているプラットフォーム
• Linux x86_64(Intel64/AMD64)
サポートしているOS
• CentOS 5, 6, 7
追加でインストールするもの
• Mecab : 形態素解析で必要
• Groonga
• Mroonga
• Groongaノーマライザー
インストール方法は全て日本語で提供されて
いる。
インストール方法
% sudo yum install centos-release-SCL
% sudo rpm -ivh
http://packages.groonga.org/centos/groonga-
release-1.1.0-1.noarch.rpm
% sudo yum makecache
% sudo yum install -y mysql55-mysql-server
% sudo yum install -y mysql55-mroonga
% sudo scl enable mysql55 "mysqladmin -u root
password 'new-password’”
% sudo yum install -y groonga-normalizer-mysql
% sudo yum install -y groonga-tokenizer-mecab
使い方1
mysql> CREATE TABLE contents (
-> id INT PRIMARY KEY AUTO_INCREMENT,
-> title VARCHAR(255),
-> kana VARCHAR(255),
-> FULLTEXT INDEX (kana) COMMENT 'parser "TokenBigram"'
-> ) ENGINE = mroonga COMMENT = 'engine "innodb"' DEFAULT CHARSET utf8mb4
COLLATE=utf8mb4_unicode_ci;
mysql> INSERT INTO contents (title,kana) VALUES ("牛肉","ぎゅうにく");
mysql> INSERT INTO contents (title,kana) VALUES ("豚肉","ぶたにく");
mysql> INSERT INTO contents (title,kana) VALUES ("牛乳","ぎゅうにゅう");
mysql> INSERT INTO contents (title,kana) VALUES ("筍","たけのこ");
mysql> INSERT INTO contents (title,kana) VALUES ("数の子","かずのこ");
mysql> select * from contents;
+----+--------+--------------------+
| id | title | kana |
+----+--------+--------------------+
| 1 | 牛肉 | ぎゅうにく |
| 2 | 豚肉 | ぶたにく |
| 3 | 牛乳 | ぎゅうにゅう |
+----+--------+--------------------+
コメントでパーサを指定する
ENGINEはmroongaをCOMMENT
でMySQLのエンジンを指定する。
COMMENTを指定しなかった場
合は、 ストレージモードでテー
ブルが作成される。
使い方2
mysql> SELECT * FROM contents WHERE MATCH(kana) AGAINST("ぎゅう");
+----+--------+--------------------+
| id | title | kana |
+----+--------+--------------------+
| 1 | 牛肉 | ぎゅうにく |
| 3 | 牛乳 | ぎゅうにゅう |
+----+--------+--------------------+
2 rows in set (0.02 sec)
mysql>
mysql> SELECT * FROM contents WHERE MATCH(kana) AGAINST("ニク");
+----+--------+-----------------+
| id | title | kana |
+----+--------+-----------------+
| 1 | 牛肉 | ぎゅうにく |
| 2 | 豚肉 | ぶたにく |
+----+--------+-----------------+
2 rows in set (0.02 sec)
ひらがな、カタカナが同一視されているのはMySQLのCOLLATEの設定が効いているため.。

MySQL対応全文検索システムMroonga(むるんが)