MacのMySQLにMeCab(mecab-ipadic含む)をインストール

スポンサーリンク
スポンサーリンク

はじめに

インターネットに書いてある情報はほとんどがLinuxを前提としており、Macにインストールする場合はエラーになります。(私はエラーになりました。そしてとても時間をロスしました。)

エラー内容は以下のようなものです。

ERROR 1126 (HY000): Can't open shared library '/usr/local/Cellar/mysql@5.7/5.7.32/lib/plugin/libpluginmecab.so' (errno: 2 dlopen(/usr/local/Cellar/mysql@5.7/5.7.32/lib/plugin/libpluginmecab.so, 2): no suitable image found. Did find:

要は本来MySQLに付属しているはずのMeCabのプラグインが存在しないということです。
たしかに上記のフォルダにlibpluginmecab.soはありませんでした。

インターネットでエラーの原因や解決方法を調べても、現時点では情報がありませんでした。

というより、MacのMySQLにMeCabにインストールする情報自体がありませんでした。
ニーズがないのですかね。開発環境に必要だと思うのですが。

そして諦めかけましたが、なんとか解決できたので皆さんに共有しようと思います。

バージョンなどで解決できない可能性はありますが、なんらかのヒントになれば幸いです。

環境

  • macOS Catalina 10.15.7
    *Windowsでも同じようにハマっている方がいましたが同じように解決できるかも。
  • MySQL 5.7
    *たぶんMySQL8も同じエラーが発生したと思います。私は8が駄目だったので5.7で試行錯誤した経緯です。
    MySQL8で本記事の内容は試していませんので対処できるかはわかりませんが試す価値はあると思います。

PythonにMeCabをインストール

PythonでMeCabを使えるようにインストールすることはとても簡単です。brewでMeCabをインストールしてMeCabのライブラリをインストールするだけです。

しかしMySQLのプラグインは関係ありません。当たり前ですが。。。

MeCabにインストールの手順

インストールの流れ

  1. MySQLをインストールする。
  2. MySQLをダウンロードしてlibpluginmecab.soを手に入れる。*ここが大きなポイント
  3. MeCabをインストールする。
  4. 設定ファイルを編集する。
  5. MeCabのプラグインをインストールする。

MySQLをインストールする

Homebrewを使ってインストールします。今回、私は5.7を指定しています。

brew install mysql@5.7

MySQLをダウンロードしてlibpluginmecab.soを手に入れる

MySQLをインストールすればMeCabが付属されるはずなのですが、なぜかありませんでした。
そこで、本家よりMySQLをダウンロードして、プラグインのlibpluginmecab.soを手に入れることにしました。

以下のサイトよりMySQLをまるごとダウンロードしてください。
OSとMySQLのバージョンが合うようにしてください。MySQLのバージョンは多少異なっても大丈夫そうです。

MySQL :: Download MySQL Community Server (Archived Versions)

私は以下のファイルをダウンロードしましたが、brewでインストールしたMySQLのバージョン5.7.32より一つ下になりました。

mysql-5.7.31-macos10.14-x86_64.tar

次に、ダウンロードした解凍すると2つの圧縮ファイルがありますが、以下のファイルを解凍します。

mysql-5.7.31-macos10.14-x86_64.tar.gz

/lib/pluginのフォルダにあるlibpluginmecab.soを以下のフォルダにコピペします。

/usr/local/Cellar/mysql@5.7/5.7.32/lib/plugin/

MeCabをインストールする

こちらもHomebrewを使ってインストールします。

brew install mecab mecab-ipadic

*mecab-ipadicは別途使用するかも知れないのでインストールしておきました。新語・固有表現に強いそうです。

設定ファイルを編集する。

/usr/local/etcにある以下の2つのファイルを編集します。テキストエディタなどで開いてください。

mecabrc

拡張子はありませんが編集することができます。

以下が設定されていることを確認してください。合わせて、以下のフォルダが存在するかも確認してください。

dicdir = /usr/local/lib/mecab/dic/ipadic

または

dicdir = /usr/local/lib/mecab/dic/mecab-ipadic-neologd

上記によって、使用する辞書が変更できます。

my.cnf

以下を追記します。

loose-mecab-rc-file=/usr/local/etc/mecabrc
innodb_ft_min_token_size=2
  • loose-mecab-rc-fileは上記のmecabrcのパスを設定します。
  • innodb_ft_min_token_sizeは文字の最小サイズを設定します。

MeCabのプラグインをインストールする

MySQLを起動(または再起動)

MySQLを起動(または再起動)します。再起動しないと上記の設定ファイルが反映されません。

  • 起動:mysql.server start
  • 再起動:mysql.server restart

MySQLにログインします。

mysql -uroot

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

INSTALL PLUGIN mecab SONAME 'libpluginmecab.so';

上記を実行します。たぶんOSよりブロックされると思います。
Macのシステム環境ー>セキュリティーとプライバシーー>一般のタブ内にある「ダウンロードしたアプリケーションの実行の許可」で許可してください。

再度、上記を実行します。

ここでエラーが出ず、以下のように表示されればOKです。

Query OK, 0 rows affected (0.04 sec)

もしエラーが出たら、以下を確認してください。

ERROR 1126 (HY000): Can't open shared library '/usr/local/Cellar/mysql@5.7/5.7.32/lib/plugin/libpluginmecab.so' (errno: 1 dlopen(/usr/local/Cellar/mysql@5.7/5.7.32/lib/plugin/libpluginmecab.so, 2): no suitable image found.  Did find:/usr/local/Cell)

上記の場合、異なるlibpluginmecab.soをダウンロードした恐れがあります。私ははじめLinuxのlibpluginmecab.soをダウンロードしましたが上記のエラーがでました。

ERROR 1123 (HY000): Can't initialize function 'mecab'; Plugin initialization function failed.

上記の場合、設定したパスが異なっている可能性があります。パスが存在するか確認してください。

インストールされたか確認

MySQLのプラグイン一覧で確認

show plugins;

以下のように入っています。

| mecab                     | ACTIVE  | FTPARSER          | libpluginmecab.so | GPL    |

MeCabの文字コードを確認

SHOW STATUS LIKE 'mecab_charset';

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

特に変更することもなく、UTF8になっています。

動作するか確認

適当なテーブルを作成して、動作を確認してみます。

CREATE DATABASE test;
CREATE TABLE test.contents (
  `id` INT(10) UNSIGNED AUTO_INCREMENT COMMENT 'id',
  `title` VARCHAR(100),
  PRIMARY KEY (`id`),
  FULLTEXT INDEX mecab_idx (`title`) WITH PARSER mecab
) ENGINE=InnoDB CHARACTER SET utf8;
INSERT INTO test.contents (`title`) VALUES ('今日はいい天気です'),('明日はいい天気かな')
SELECT * FROM test.contents WHERE MATCH (title) AGAINST('今日' IN BOOLEAN MODE);
+----+-----------------------------+
| id | title                       |
+----+-----------------------------+
|  1 | 今日はいい天気です          |
+----+-----------------------------+
1 row in set (0.00 sec)

簡単すぎるテストですが、一応はヒットしています。ヤッター!完了です!

 

コメント

タイトルとURLをコピーしました