Mattermostの日本語メッセージ全文検索対応まとめ(MySQL編)

[Mattermostの日本語フォーラムを作ってもらったりした](https://forum.mattermost.org/c/international/japanese)ので、簡単にまとめてみました。

確認環境は以下になります。

* Mattermost 2.1.0
* CentOS 7.2
  * MySQL 5.6.29
      * Mroonga 6.01
  * MySQL 5.7.11

# MySQL 5.5 以前を利用している場合

Mattermostは非対応です。

参考: [Software & Hardware Requirements — Mattermost 2.0 documentation](http://docs.mattermost.com/install/requirements.html#database-software)

# MySQL 5.6 ~ 5.7.5 を利用している場合

[Mroonga ストレージエンジン](http://mroonga.org/ja/) を利用します。

## Mroongaのインストール

### 1. インストール

```
$ sudo yum install -y http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
$ sudo yum makecache
$ sudo yum install -y mysql-community-mroonga
$ sudo systemctl restart mysqld
```

### 2. ストレージエンジンを変更

```mysql
$  mysql mattermost -u mmuser -pmmuser_password

# Mroongaストレージエンジンが有効になっていることを確認
mysql> SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
 ...
| Mroonga            | YES     | CJK-ready fulltext search, column store                        | NO           | NO   | NO         |
 ...
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

# PostsテーブルのストレージエンジンをMroongaに変更
mysql> ALTER TABLE `Posts` ENGINE = Mroonga;
```

## ngram

ストレージエンジンをMroongaに変更するだけで有効になります。デフォルトでは「バイグラム(2-gram)」となっています。

## 形態素解析(MeCab)

ストレージエンジンをMroongaに変更した上で、以下の作業を行います。

### 1. MeCabトークナイザーのインストール

```
$ sudo yum install -y groonga-tokenizer-mecab
```
### 2. FULLTEXT INDEXの再構築

```mysql
$  mysql mattermost -u mmuser -pmmuser_password

mysql> ALTER TABLE `Posts` DROP INDEX idx_posts_message_txt;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE `Posts` ADD FULLTEXT INDEX idx_posts_message_txt (`Message`) COMMENT 'parser "TokenMecab"';
Query OK, 0 rows affected (0.02 sec)
```

## その他の全文検索パーサ

Mroongaが対応しているトークナイザー（ユニグラム、トリグラム、etc）を利用することができます。

参考: [4.3. ストレージモード — Mroonga v6.01 documentation](http://mroonga.org/ja/docs/tutorial/storage.html#how-to-specify-the-parser-for-full-text-search)

# MySQL 5.7.6以降を利用している場合

標準で同梱されている[ngram Full-Text Parser Plugin](https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-ngram.html)もしくは [MeCab Full-Text Parser Plugin](https://dev.mysql.com/doc/refman/5.7/en/fulltext-search-mecab.html) を利用します。

## ngram

- [Mattermost(v2.1.0)の日本語メッセージ全文検索をMySQL 5.7の標準ngramパーサを使い暫定対応 - Qiita](http://qiita.com/terukizm/items/b477943b63c66ab7d454)

## 形態素解析(MeCab)

### 1. MeCab, Mecab IPA-dictionaryのインストール

```bash
$ sudo rpm -ivh http://packages.groonga.org/centos/groonga-release-1.1.0-1.noarch.rpm
$ sudo yum -y install mecab mecab-ipadic
```

### 2. my.cnfに設定を追加

```my.cnf
[mysqld]
# MeCab Full-Text Parser Plugin Settings
loose-mecab-rc-file=/etc/mecabrc
innodb_ft_min_token_size=1
```

mysqldの再起動を忘れずに。

```bash
$ sudo systemctl restart mysqld
```

### 3. MeCab Full-Text Parser Pluginのインストール

```mysql
$ mysql -u root -p

mysql> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';
Query OK, 0 rows affected (0.04 sec)

# 確認
mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+----------------------+---------+
| Name                       | Status   | Type               | Library              | License |
+----------------------------+----------+--------------------+----------------------+---------+
  ...
| mecab                      | ACTIVE   | FTPARSER           | libpluginmecab.so    | GPL     |
+----------------------------+----------+--------------------+----------------------+---------+
```

### 4. FULLTEXT INDEXの再構築

```mysql
$  mysql mattermost -u mmuser -pmmuser_password

mysql> ALTER TABLE `Posts` DROP INDEX idx_posts_message_txt;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE Posts ADD FULLTEXT INDEX idx_posts_message_txt (`Message`) WITH PARSER mecab;
Query OK, 0 rows affected (0.02 sec)
```

# 参考: N-gramと形態素解析の比較

以下のサイトがわかりやすいです。

* [第6回 N-gramと形態素解析との比較：検索エンジンを作る｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/serial/01/make-findspot/0006)
* [全文検索(索引文字列の抽出手法) - Wikipedia](https://ja.wikipedia.org/wiki/%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2#.E7.B4.A2.E5.BC.95.E6.96.87.E5.AD.97.E5.88.97.E3.81.AE.E6.8A.BD.E5.87.BA.E6.89.8B.E6.B3.95)
* [Ngram(N-gram)とは何か & 形態素解析との比較](http://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/20060203.html)

以上、ご参考になれば幸いです。