MySQL5 [Mroonga 日本語検索]

Mroonga は日本語全文検索senna の後継になります。より高速高性能で扱いやすくなりました。
更新日 2016-06-06

概要

Mroonga と Groonga の説明です。

Groonga について

Groonga はデータベースエンジンそのものです。日本語検索を高速で行う為には、やはりデータベースエンジンそのものから設計が必要なのでしょう。mroonga はデフォルトでgroonga を ストレージエンジンとして使います。

Mroonga について

Mroonga はMySQL (またはMriaDB) で日本語検索機能を提供します。既存のMySQL 環境を壊さずにプラグインとしてインストールできます。基本はgroonga をストレージエンジンとして 使いますが、MySQL 本来のデータベースを利用するラッパーモードもあります。どちらもテーブル設計時のささやかな違いはありますが、MySQL クライアントからは意識する事なく 使えます。

インストール

今回もソースからビルドしてインストールします。CentOS7.1 (minimam install)にMySQL5.7 + Mroonga 6.0.3 + Groonga 6.03 を入れます。

MySQL のインストール

最新のソースコードをオフィシャルサイトよりダウンロードしてビルドします。空き領域が足りないとmake エラーになります。20〜30分かかります。
// 開発ツール
yum groupinstall "Development Tools" -y
yum groupinstall "Compatibility libraries" -y
yum install ncurses-devel cmake zlib-devel -y

cd /usr/local/src
wget "https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.12.tar.gz"
tar zxvf mysql-boost-5.7.12.tar.gz
cd mysql-5.7.12

cmake . \
 -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.12 \
 -DMYSQL_DATADIR=/var/mysql/data \
 -DDEFAULT_CHARSET=utf8mb4 \
 -DDEFAULT_COLLATION=utf8mb4_general_ci \
 -DWITH_INNOBASE_STORAGE_ENGINE=1 \
 -DWITH_BOOST=boost

make
make install
続いて初期設定を行います。
groupadd mysql
useradd -g mysql -s /sbin/nologin mysql

ln -s /usr/local/mysql-5.7.12 /usr/local/mysql
chown -R mysql:mysql /usr/local/mysql


// my.cnf の作成
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf

vi /etc/my.cnf

 [mysqld]

 // IPv6 listen
 bind_address=::
 server_id=131
データベースストア(Directory)の初期化(起動前に必須)
// データベースストアの新規作成
#mkdir /var/mysql
#mkdir /var/mysql/data
#chown -R mysql.mysql /var/mysql/data


// mysql_install_db は非推奨になりました。
/usr/local/mysql/bin/mysqld \
 --initialize-insecure \
 --basedir=/usr/local/mysql \
 --datadir=/var/mysql/data \
 --user=mysql
起動スクリプトを設定します。
// 起動スクリプト
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

vi /etc/init.d/mysqld

 basedir=/usr/local/mysql
 datadir=/var/mysql/data
起動できれば成功です。
systemctl start mysqld
systemctl enable mysqld
パスも通しておきます。
vi ~/.bashrc

 PATH=$PATH:/usr/local/mysql/bin
 export PATH

MeCabのインストール

MeCab(和布蕪) は、日本語の文章を解析して検索用データにするエンジンです。英語はスペースで切れますが、日本語は切れないので アルゴリズム的に困難な作業と思われます。mroonga に相応しい高性能エンジンと言えるでしょう。
オフィシャルサイト からダウンロードできます。
// http://taku910.github.io/mecab/#download

cd /usr/local/src
wget "https://googledrive.com/host/0B4y35FiV1wh7cENtOXlicTFaRUE" -O mecab-0.996.tar.gz

tar zxfv mecab-0.996.tar.gz
cd mecab-0.996

./configure \
 --prefix=/usr/local/mecab-0.996

 // これは不要の模様
 // --with-charset=utf8mb4

make
make check
make install

ln -sfn /usr/local/mecab-0.996 /usr/local/mecab
次にMeCab 用の辞書(IPA 版)をインストールします。IPA を使う理由は、単に推奨と書かれているからです。文字コード指定が必要です。今回はutf8mb4 で 利用する予定でコンパイルします。
同じくオフィシャルサイトの下の方から、ファイル名は mecab-ipadic-2.7.0-20070801.tar.gz です。
cd /usr/local/src
wget "https://googledrive.com/host/0B4y35FiV1wh7MWVlSDBCSXZMTXM" -O mecab-ipadic-2.7.0-20070801.tar.gz

tar zxfv mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801

./configure \
 --prefix=/usr/local/mecab \
 --with-mecab-config=/usr/local/mecab/bin/mecab-config \
 --with-charset=utf8mb4

make
make install
mecab の動作テストをしてみましょう。スタンドアロンで動作します。
/usr/local/mecab/bin/mecab

// 入力
すもももももももものうち

// (参考URL  http://taku910.github.io/mecab/#parse)

groonga のインストール

groonga 本体を入れます。コンパイル時には2GB 以上メモリが無いとエラーになります。
cd /usr/local/src
wget http://packages.groonga.org/source/groonga/groonga-6.0.3.tar.gz
tar xvzf groonga-6.0.3.tar.gz
cd groonga-6.0.3

./configure \
 --with-mecab \
 --with-mecab-config=/usr/local/mecab/bin/mecab-config \
 CFLAGS="--param max-gcse-memory=268435456"


make -j$(grep '^processor' /proc/cpuinfo | wc -l)
make install
mecab が使えるか確認します。
groonga --version
// mecab の文字があれば成功
// groonga 4.1.1 [linux-gnu,x86_64,utf8,match-escalation-threshold=0,nfkc,mecab,epoll]

groonga-normalizer-mysql のインストール


オフィシャルサイト からダウンロードできます。
cd /usr/local/src
wget "http://packages.groonga.org/source/groonga-normalizer-mysql/\
groonga-normalizer-mysql-1.1.1.tar.gz"

tar zxfv groonga-normalizer-mysql-1.1.1.tar.gz
cd groonga-normalizer-mysql-1.1.1

./configure \
 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig 

make
make install

mroonga のビルド

mroonga を入れます。

cd /usr/local/src/
wget http://packages.groonga.org/source/mroonga/mroonga-6.03.tar.gz
tar zxvf mroonga-6.03.tar.gz
cd mroonga-6.03

./configure \
 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig \
 --with-mysql-source=/usr/local/src/mysql-5.7.12 \
 --with-mysql-build=/usr/local/src/mysql-5.7.12 \
 --with-mysql-config=/usr/local/mysql-5.7.12/bin/mysql_config \
 --with-default-parser=TokenMecab

make -j$(grep '^processor' /proc/cpuinfo | wc -l)
make install
groonga
register normalizers/mysql

MySQL にmroonga を設定する

mysql に接続してクエリを発行して設定作業を行います。
mysql -u root > /usr/local/share/mroonga/install.sql

// 確認(mroonga が表示されていればOK)
SHOW ENGINES;

全文検索を試す

Mecab を用いた日本語全文検索の動作を実際に確認します。

テーブルの作成

Mecab を使った全文検索が行えるテーブルを作ります。テーブル作成時にcharset はutf8mb4 等を指定します。
create database TestDB;
use TestDB;

// テーブル
create table Test1(
 uid INT PRIMARY KEY, 
 name TEXT,
 comment TEXT,
 FULLTEXT INDEX(name, comment) comment 'parser="TokenMecab"'
) ENGINE=mroonga DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

// レコード
insert into Test1(uid, name, comment) values 
(1, "東京都","東京の気温は25度です。"),
(2, "京都","京都の気温は30度です。"),
(3, "名古屋","名古屋の気温は32度です。");

// 結果を確認
SELECT * FROM Test1 WHERE MATCH(name,comment) AGAINST('東京都');
SELECT * FROM Test1 WHERE MATCH(name,comment) AGAINST('京都');
ラッパーモードで使う場合は、使いたいストレージを指定します。
create table Test1(
 uid INT PRIMARY KEY, 
 name TEXT,
 comment TEXT,
 FULLTEXT INDEX(name, comment) comment 'parser="TokenMecab"'
) ENGINE=mroonga  COMMENT='engine "innodb"' DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
mroonga をデフォルトとしておく事もできます。
vi /etc/my.cnf

 default-storage-engine=mroonga