MySQL5.7にMeCabパーサーをいれたよ


# まえがき
ちょっと全文検索まわりで簡単な性能比較をしたかったので、
その一環として、MySQL5.7とMeCabパーサーを入れました。

今回は、そのインストール作業のメモです。


# MySQLのインストール

こちらの記事を参照してやりました。

[CentOS7.3にMySQL5.7をyumでインストールする](https://qiita.com/panappe/items/97b94fed3192b09ac5a9)

## 発生したエラー
記事の手順通りにやったんだけど、自動起動設定時にエラーが発生。。

```bash
# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
```

- Mariadbが入っていた影響みたい。。
- [CentOS7の自動起動設定でエラーが出た時の対処法](https://qiita.com/binthec/items/32c62a8c776ce4aef8ce)の通り


# MeCab Parserを入れる

[InnoDB 全文検索 : MeCab Parser](https://mysqlserverteam.com/innodb-%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2-mecab-parser/)

## mecabrcファイルを編集
MeCabの設定ファイルであるmecabrcファイルに、使用する辞書を設定する。

```conf:/usr/lib64/mysql/mecab/etc/mecabrc
dicdir =  /usr/lib64/mysql/mecab/dic/ipadic_utf-8
```


## mecab_rc_fileオプションを設定する
my.cnfの`[myslqd]`セクションに`loose-mecab-rc-file`を追加する。
値はさっき編集したmecabrcファイルへの絶対パス。

```conf:/etc/my.cnf
[mysqld]
loose-mecab-rc-file=/usr/lib64/mysql/mecab/etc/mecabrc
```


## innodb_ft_min_token_sizeを設定
my.cnfの`[myslqd]`セクションに`innodb_ft_min_token_size`を追加する。
InnoDB FulltextIndexの単語最小文字数を設定する項目。

```conf:/etc/my.cnf
innodb_ft_min_token_size=2
```

## MySQLの再起動
これで設定ファイルの編集は終わりなので、MySQLを再起動する。

```bash
systemctl restart mysqld
```

## MeCabプラグインをインストール
MySQLへMeCabプラグインをインストールする。
MySQL内でコマンドを1つ投げればお終い。

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


### インストール確認を使用としたらエラー

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

mysql>  SHOW STATUS LIKE 'mecab_charset';
ERROR 1146 (42S02): Table 'performance_schema.session_status' doesn't exist
```

ｳﾍｪ・・・・('A`)

[Table 'performance_schema.session_variables' doesn't exist](https://stackoverflow.com/questions/31967527/table-performance-schema-session-variables-doesnt-exist)

`mysql_upgrade`を実行したらいいみたい。

```bash
# mysql_upgrade
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
mysql_upgrade: (non fatal) [ERROR] 1728: Cannot load from mysql.proc. The table is probably corrupted
mysql_upgrade: (non fatal) [ERROR] 1545: Failed to open mysql.event
mysql_upgrade: [ERROR] 1136: Column count doesn't match value count at row 1

# mysql_upgrade --force
Checking server version.
Running queries to upgrade MySQL server.
mysql_upgrade: [ERROR] 1136: Column count doesn't match value count at row 1
Checking system database.
mysql.column_stats                                 OK
mysql.columns_priv                                 OK
mysql.db                                           OK
mysql.engine_cost                                  OK
mysql.event                                        OK
mysql.func                                         OK
mysql.general_log                                  OK
mysql.gtid_executed                                OK
mysql.gtid_slave_pos                               OK
mysql.help_category                                OK
mysql.help_keyword                                 OK
mysql.help_relation                                OK
mysql.help_topic                                   OK
mysql.host                                         OK
mysql.index_stats                                  OK
mysql.innodb_index_stats                           OK
mysql.innodb_table_stats                           OK
mysql.ndb_binlog_index                             OK
mysql.plugin                                       OK
mysql.proc                                         OK
mysql.procs_priv                                   OK
mysql.proxies_priv                                 OK
mysql.roles_mapping                                OK
mysql.server_cost                                  OK
mysql.servers                                      OK
mysql.slave_master_info                            OK
mysql.slave_relay_log_info                         OK
mysql.slave_worker_info                            OK
mysql.slow_log                                     OK
mysql.table_stats                                  OK
mysql.tables_priv                                  OK
mysql.time_zone                                    OK
mysql.time_zone_leap_second                        OK
mysql.time_zone_name                               OK
mysql.time_zone_transition                         OK
mysql.time_zone_transition_type                    OK
mysql.user                                         OK
Upgrading the sys schema.
mysql_upgrade: [ERROR] 1136: Column count doesn't match value count at row 1
Checking databases.
sys.sys_config                                     OK
Upgrade process completed successfully.
Checking if update is needed.
[root@requ mecab]# systemctl restart mysqld
```

`--force`オプションをつけたら作られたみたい。

```bash
mysql>  SHOW STATUS LIKE 'mecab_charset';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| mecab_charset | utf8  |
+---------------+-------+
1 row in set (0.01 sec)
```


# 使ってみる
とりあえずちゃんと動くかの確認がしたいので、
簡単なテーブルとデータを用意。

```sql
CREATE TABLE `t_contents` (
  `id` INT(10) UNSIGNED AUTO_INCREMENT COMMENT 'id',
  `book` VARCHAR(100) NOT NULL COMMENT '書籍名',
  `title` VARCHAR(100) NOT NULL COMMENT '章タイトル',
  `created_at` DATETIME NOT NULL COMMENT '作成日時',
  `updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '更新日時',
  PRIMARY KEY (`id`),
  FULLTEXT INDEX mecab_idx (`title`) WITH PARSER mecab
) ENGINE=InnoDB CHARACTER SET utf8mb4 COMMENT '目次';

INSERT INTO `t_contents` (`book`, `title`, `created_at`)
VALUES ('Software Design 2018年4月号', '自分で構築するか，APIで機能を使うか', NOW())
,('Software Design 2018年4月号', '機械学習の始め方', NOW())
,('Software Design 2018年4月号', '脱・手順書！', NOW())
,('Software Design 2018年4月号', 'Pythonマイツール作成で仕事効率化', NOW())
,('Software Design 2018年4月号', '社会インフラシステムを支えるLinux　その信頼性はどのように維持されているか', NOW())
,('Software Design 2018年4月号', 'Civil Infrastructure Platformプロジェクトの取り組み', NOW())
,('Software Design 2018年4月号', '［短期連載］実践！ GPUサーバでディープラーニング', NOW())
,('Software Design 2018年4月号', '【2】ディープラーニングにおける計算資源の重要性', NOW())
,('Software Design 2018年4月号', '［短期連載］ARKitとUnityで作るiPhone ARアプリ集中特講', NOW())
,('Software Design 2018年4月号', '【4】猫とのやりとりとUI追加', NOW());
```

テーブルとデータは、手元にあった「Software Design 2018年4月号」の目次を使いました。

```sql
SELECT * FROM t_contents WHERE MATCH (title) AGAINST('計算資源' IN BOOLEAN MODE);
+----+--------------------------------+------------------------------------------------------------------------+---------------------+---------------------+
| id | book                           | title                                                                  | created_at          | updated_at          |
+----+--------------------------------+------------------------------------------------------------------------+---------------------+---------------------+
|  8 | Software Design 2018年4月号    | 【2】ディープラーニングにおける計算資源の重要性                        | 2018-04-15 01:54:23 | 2018-04-15 01:54:23 |
+----+--------------------------------+------------------------------------------------------------------------+---------------------+---------------------+
1 row in set (0.00 sec)
```

動いたので大丈夫そう。


# あとがき
こんだけのことなのに2回もエラーが出た。。

実は別のVagrantでいれたサーバーではすんなり入ったので、
特に記録を残すこともないかなぁ、と思ってたらこの有様。

また別のマシンに入れるときになんかあったら追記するかも・・・・？