Edited at

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

More than 1 year has passed since last update.


まえがき

ちょっと全文検索まわりで簡単な性能比較をしたかったので、

その一環として、MySQL5.7とMeCabパーサーを入れました。

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


MySQLのインストール

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

CentOS7.3にMySQL5.7をyumでインストールする


発生したエラー

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

# systemctl enable mysqld

Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.


MeCab Parserを入れる

InnoDB 全文検索 : MeCab Parser


mecabrcファイルを編集

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


/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ファイルへの絶対パス。


/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の単語最小文字数を設定する項目。


/etc/my.cnf

innodb_ft_min_token_size=2



MySQLの再起動

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

systemctl restart mysqld


MeCabプラグインをインストール

MySQLへMeCabプラグインをインストールする。

MySQL内でコマンドを1つ投げればお終い。

mysql> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';

Query OK, 0 rows affected (0.23 sec)


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

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

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

# 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オプションをつけたら作られたみたい。

mysql>  SHOW STATUS LIKE 'mecab_charset';

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| mecab_charset | utf8 |
+---------------+-------+
1 row in set (0.01 sec)


使ってみる

とりあえずちゃんと動くかの確認がしたいので、

簡単なテーブルとデータを用意。

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月号」の目次を使いました。

SELECT * FROM t_contents WHERE MATCH (title) AGAINST('計算資源' IN BOOLEAN MODE);

+----+--------------------------------+------------------------------------------------------------------------+---------------------+---------------------+
| id | book | title | created_at | updated_at |
+----+--------------------------------+------------------------------------------------------------------------+---------------------+---------------------+
| 8 | Software Design 20184月号 | 2】ディープラーニングにおける計算資源の重要性 | 2018-04-15 01:54:23 | 2018-04-15 01:54:23 |
+----+--------------------------------+------------------------------------------------------------------------+---------------------+---------------------+
1 row in set (0.00 sec)

動いたので大丈夫そう。


あとがき

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

実は別のVagrantでいれたサーバーではすんなり入ったので、

特に記録を残すこともないかなぁ、と思ってたらこの有様。

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