MacでMroongaを使って全文検索

MySQLの既存のDBで全文検索を行いたいと思い、MySQLのプラグインとして動作するMroongaを使ってみることに。ドキュメントを参考に、InnoDBを使っている環境で使えるようになるまでをまとめてみた。

[Mroonga](http://mroonga.org/ja/)
[ドキュメント](http://mroonga.org/ja/docs/)

# インストール

まずはHomebrewでインストール。


```sh
$ brew install https://raw.github.com/mroonga/homebrew/master/mroonga.rb --use-homebrew-mysql --with-mecab
```

あとはドキュメントにある通り、まずはインストールされたかチェック。

```mysql
$ SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+-
| Engine             | Support | Comment                                                        | Transactions | XA   |
+--------------------+---------+----------------------------------------------------------------+--------------+------+-
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   |
+--------------------+---------+----------------------------------------------------------------+--------------+------+-
```

ない。
なければINSTALL PLUGINしてやる。

```mysql
$ INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
```

```mysql
$ SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+-
| Engine             | Support | Comment                                                        | Transactions | XA   |
+--------------------+---------+----------------------------------------------------------------+--------------+------+-
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   |
| Mroonga            | YES     | CJK-ready fulltext search, column store                        | NO           | NO   |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   |
+--------------------+---------+----------------------------------------------------------------+--------------+------+-
```

無事インストール完了。

# モードの選択
Mroongaにはストレージモードとラッパーモードがある。
前者はデータストアも全文検索もすべてGroongaの機能を使うモード、後者はMyISAMやInnoDBといった他のストレージエンジンに全文検索機能のみ追加するモード。手っ取り早く既存のテーブルに全文検索機能をつけたい場合後者を選ぶことになる。
(メリット・デメリットはもちろんあるため、本来どちらを選択すべきかは以下ドキュメントから詳細を読むこと)

[他のストレージエンジンとの連携](http://mroonga.org/ja/docs/characteristic.html#associate-with-other-storage-engines)

# テーブルの変更
FULLTEXTインデックスの追加と、ストレージエンジンの変更を行う。ラップする対象のストレージエンジンはコメントで以下のように指定する。

```mysql
$ ALTER TABLE sandbox ADD FULLTEXT(name, address);
$ ALTER TABLE sandbox ENGINE = Mroonga COMMENT = 'engine "InnoDB"';
```

[ラッパーモードの利用方法](http://mroonga.org/ja/docs/tutorial/wrapper.html#how-to-use-wrapper-mode)

あとは`MATCH(...) AGAINST(...)`構文で適当に検索すれば全文検索できる。

```mysql
$ SELECT * FROM sandbox WHERE MATCH(name, address) AGAINST ('上野');
```

ものすごく簡単に使うことができた。
ただしラッパーモードはトランザクション非対応なので注意が必要。
詳細は以下の記事

[MroongaのラッパーモードでInnoDBを使う落とし穴](http://yoku0825.blogspot.jp/2014/04/mroongainnodb.html)

ラッパーモードはあまりupdateがかからないテーブルで使用するといい気が。
で、トリガーとか設定しておけばいいかな(データ量が多いとものすごい時間かかりそうだが)
やはり本格的に運用したいとなったらストレージモードかSolr等の他の全文検索エンジンですかね。

他制限事項や注意点などはドキュメントをよく読むこと。