トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

Groonga

RaspberryPi2に全文検索のためのGroongaMariaDBMroonga)を入れようかと思った次第。

みたいな感じになるんだろうか? とりあえずやってみる。

MariaDBのインストール

apt-getを使ってバイナリを入れるのが一番簡単なんですが、groongaのリポジトリにはi386用とamd用しか用意されていない模様(汗)。
またmariadb-10.0.15からmroongaがバンドルされたようなんですが、raspbianのjessieのapt-getでインストールできるmariadb-10.0.22にはバンドルされていない。

MariaDBについにバンドルしてリリースされました
http://mroonga.org/ja/blog/2014/11/29/release.html

兎にも角にもソースから入れるしかないんですが、groongaやmecabとの関係が良くわからないんで、とりあえずコンパイルしてみた(汗)。

で。

MariaDB-10.1.11のソースに付いてるMroongaGroongaは5.0.5、Mroongaは5.04、normalizerも付いてて、MeCabも別途インストールしてあればmecab-configから使えるようになってるっぽい。

MariaDB [(none)]> show variables like 'mroonga_libgroonga_version';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| mroonga_libgroonga_version | 5.0.5 |
+----------------------------+-------+

MariaDB [(none)]> show variables like 'mroonga_version';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| mroonga_version | 5.04  |
+-----------------+-------+

しかし、折角ソースからコンパイルするなら最新版が良いかなと。この時点(2016/2/5)での最新版はgroonga-5.1.2とmroonga-5.12。

とりあえずMariaDBのソースを取得。

Downloads - MariaDB
https://downloads.mariadb.org/
# cd /usr/local/src
# wget "https://downloads.mariadb.org/f/mariadb-10.1.11/source/mariadb-10.1.11.tar.gz/from/http%3A//ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/?serve" -O mariadb-10.1.11.tar.gz
# tar zxvf mariadb-10.1.11.tar.gz
# cd mariadb-10.1.11

コンパイル用ドキュメント。

Generic Build Tnstructions
https://mariadb.com/kb/en/mariadb/generic-build-instructions/

manualでBUILD/autorun.shから./configureでもよさげな気がしたのですが、cmakeが流行モノみたいなのでインスコ。

# apt-get install build-essential cmake

で、早速cmakeしてみると...

# cmake . (略
:
-- Could NOT find PkgConfig (missing:  PKG_CONFIG_EXECUTABLE)
:
-- Could NOT find Curses (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:85 (MESSAGE):
  Curses library not found.  Please install appropriate package,

      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is libncurses5-dev, on Redhat and derivates it is ncurses-devel.

errorやらworningやらで必要なものを入れる。

# apt-get install pkg-config libncurses5-dev bison libxml2-dev

改めてcmakeする前に、バンドル版の古いgroonga、mroongaがインスコされては困るので無効にする方法を探した。

Mroonga-bundled MariaDB cannot disable Mroonga
https://github.com/mroonga/mroonga/issues/24

と思ったらmariadb-10.0系と10.1系でプラグインの外し方が変わった模様。

groonga is compiled even with -DPLUGIN_MROONGA=NO
https://mariadb.atlassian.net/browse/MDEV-8969?jql=project%20%3D%20MDEV%20AND%20component%20%3D%20%22Storage%20Engine%20-%20Mroonga%22

エラーやワーニングで中途半端に出来てしまったCMakeCache.txtを削除し、再チャレンンジ。

# rm CMakeCache.txt
# cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DMYSQL_UNIX_ADDR=/var/run/mysqld/mysqld.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=complex \
-DPLUGIN_MROONGA=NO
# make -j4
# make install

ちなみにオプションで

-DBUILD_CONFIG=mysql_release

を付けるとMySQL系のオプションの初期設定(下記参照先)にしてくれるみたいだが、ここではやらない。

2.9.4 MySQL Source-Configuration Options
https://dev.mysql.com/doc/refman/5.5/en/source-configuration-options.html

グループを作成。

# groupadd mysql
# useradd mysql -g mysql -s /sbin/nologin

データベースの初期設定。

# cd /usr/local/mysql
# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

カレントディレクトリが/usr/local/mysqlのとき、basedirが.でdatadirが.dataとなり、上記のbasedirとdatadirは省略しても大丈夫そう。userを省略するとdatadirに作成されるファイルの所有者が、上記の例ではrootになる。

インストール先の権限設定。これをやっておかないとmysqldがdataディレクトリとかに書き込めないため起動できない。

# chown -R mysql .

cnfおよび起動スクリプトのコピー。

# cp support-files/my-medium.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/init.d/mysqld

自動起動の設定と手動起動。

# update-rc.d mysqld defaults
# /etc/init.d/mysqld start

起動できないときは大体パーミッションか、dataディレクトリとかのパスがおかしいとき。
もしbasedirやdatadirがデフォルトから変更しており、うまく認識されていないときは

# vim /etc/init.d/mysqld

basedir=/path/to/mysql
datadir=/path/to/mysql/data

みたいに手動設定もできる。

さて、mysqldに接続するためのmysqlクライアントだが、インストール先の/usr/local/mysql/binだとパスが通っていないため

# ln -s /usr/local/mysql/bin/mysql /usr/local/bin

でシンボリックを作成しておく。

とりあえずrootに任意パスワードを設定して接続確認。

# /usr/local/mysql/bin/mysqladmin -u root password 'new-password'
# mysql -u root -p

MariaDB [(none)]> status
--------------
mysql  Ver 15.1 Distrib 10.1.11-MariaDB, for Linux (armv7l) using readline 5.1

Connection id:          4
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server:                 MariaDB
Server version:         10.1.11-MariaDB-log Source distribution
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 1 hour 31 min 3 sec

MariaDB [(none)]> show engines;
+--------------------+---------+--------------------------------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                                          | Transactions | XA   | Savepoints |
+--------------------+---------+--------------------------------------------------------------------------------------------------+--------------+------+------------+
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                                            | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                                        | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                                                            | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                                                               | NO           | NO   | NO         |
| SEQUENCE           | YES     | Generated tables filled with sequential values                                                   | YES          | NO   | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                                               | NO           | NO   | NO         |
| Aria               | YES     | Crash-safe tables with MyISAM heritage                                                           | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, foreign keys and encryption for tables | YES          | YES  | YES        |
+--------------------+---------+--------------------------------------------------------------------------------------------------+--------------+------+------------+

この時点ではMroongaは無し。

 いつのまにかMariaDBが起動できなくなった

MariaDBをソースからインストールした後、nginxとphp5-fpmをapt-getでインストールしたらMariaDBが起動できなくなった(汗)。

php5-fpmと合わせてphp5-mysqlをインストールした際、mysql-common(mysql-5.5用の/etc/mysql/my.cnfが入っている)もインストールされて

/etc/my.cnf ← ソースから配置したmariadb-10.1のmy.cnf
/etc/mysql/my.cnf ← apt-get installで入ってしまったmysql-5.5のmy.cnf

となり起動時に上書きされ、パスは違うわ設定は古いわで落ちていた模様。

ちなみにエラーログはこんな感じ。

[Note] Using unique option prefix 'key_buffer' is error-prone and can break in the future. Please use the full name 'key_buffer_size' instead.
:
[ERROR] Can't find messagefile '/usr/share/mysql/errmsg.sys'
[ERROR] Aborting

/etc/my.cnfを/etc/mysql/my.cnfに移動してOKとなる。

MySQL - 設定ファイル my.cnf 読み込み順序
http://www.mk-mode.com/octopress/2013/06/03/mysql-config-file-read-order/

MeCabのインストール

日本語の文章を検索するに当たって、分かち書き?っていうんでしょうか、上手に日本語を分解、解析できたほうが検索インデックスも上手に作成できて、結果的に検索もうまくいく。
その部分をやってくれるのがMeCabです。形態素解析エンジンっていうみたいですけど、よくわかりません(汗)。

MeCab:Yet Another Part-of-Speech and Morphological Analyzer
http://taku910.github.io/mecab/

本家より本体と推奨辞書(ipadic)を取得しておきます。
いまどきはLinuxもほとんどUTF8なのでcharsetを指定してmake。

# wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE" -O mecab-0.996.tar.gz
# tar zxvfp mecab-0.996.tar.gz
# cd mecab-0.996
# ./configure --with-charset=utf8 --enable-utf8-only
# make
# make install

続けて辞書をmakeすると、libmecab.soがまだシステムに認識されておらず

libmecab.so.2: cannot open shared object file: No such file or directory

となるのでldconfigをかましておくこと。

# wget "https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM" -O mecab-ipadic-2.7.0-20070801.tar.gz
# tar zxvfp mecab-ipadic-2.7.0-20070801.tar.gz
# cd mecab-ipadic-2.7.0-20070801
# ./configure --with-charset=utf8
# ldconfig
# make
# make install

実行ファイルは/usr/local/bin/mecabとmecab-config、辞書は

# mecab -D
filename:       /usr/local/lib/mecab/dic/ipadic/sys.dic
version:        102
charset:        utf8
type:           0
size:           392126
left size:      1316
right size:     1316

な感じ。

# echo "すもももももももものうち" | mecab
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS

ほかにも辞書がいくつもあるようで、下はIPADIC+αな模様。
ここでは↓はインストールしないことにする。

NAIST Japanese Dictionary
https://osdn.jp/projects/naist-jdic/
# tar zxvfp mecab-naist-jdic-0.6.3b-20111013.tar.gz
# cd mecab-naist-jdic-0.6.3b-20111013
# ./configure --with-charset=utf8
# make
# make install

Groongaのインストール

コンパイルに必要なものを揃えておく。

# apt-get install zlib1g-dev liblzo2-dev libmsgpack-dev libzmq-dev libevent-dev

mecabがパッケージからインストールされている場合、libmecab-devも必要。

# wget http://packages.groonga.org/source/groonga/groonga-5.1.2.tar.gz
# tar zxvf goonga-5.1.2.tar.gz
# cd goonga-5.1.2.tar.gz
# ./configure CFLAGS="-O0 -g3" CXXFLAGS="-O0 -g3" PKG_CONFIG_PATH=/usr/lib/pkgconfig

configureをかましたときに最後の方で

Tokenizers:
  MeCab:                 yes
    CPPFLAGS:            -I/usr/local/include
    LDFLAGS:             -L/usr/local/lib
    LIBS:                -lmecab
  KyTea:                 no

と出ればMeCabはアリ、KyTeaはナシみたいな感じ。

# make -j4

castでwarningでまくりだが無視する(汗)。

# make install

Groonga自体が機能しているのかの確認は

GroongaをインストールしてHTTPサーバを立ち上げる手順
http://qiita.com/tamano/items/a02423587fc83df7f05a

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

autogen.shでautoreconf: not foundとか言われるので先に入れておく。

# apt-get install autoconf libtool

configureを作る。

# ./autogen.sh
# ./configure CFLAGS="-O0 -g3" CXXFLAGS="-O0 -g3" PKG_CONFIG_PATH=/usr/lib/pkgconfig

configureの最後の方で

Groonga
  CFLAGS:                -I/usr/local/include/groonga
  Libraries:             -L/usr/local/lib -lgroonga
  install directory:     ${GROONGA_PLUGINS_DIR}/normalizers

な感じにGroongaを認識していれば問題ないと思う。
よければコンパイルとインストール。

# make
# make install

/usr/local/lib/groonga/plugins/normalizersにmysql.soとかが出来ればOK。

mroongaのインストール

やり方はいままでと一緒。

# wget http://packages.groonga.org/source/mroonga/mroonga-5.12.tar.gz
# tar xvzf mroonga-5.12.tar.gz
# cd mroonga-5.12
# ./configure \
    --with-mysql-source=/usr/local/src/mariadb-10.1.11 \
    --with-mysql-build=/usr/local/src/mariadb-10.1.11 \
    --with-mysql-config=/usr/local/mysql/bin/mysql_config
# make
# make install

mroongaの有効化。

# /usr/local/mysql/bin/mysql -u root -p < /usr/local/share/mroonga/install.sql

有効化で何をやっているのかはinstall.sqlの中身を読むよろし。

mariadbのmroongaを確認する

install.sqlが無事決まっていればエンジンにMroongaが表示されるはず。

MariaDB [(none)]> show engines;
+--------------------+---------+--------------------------------------------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                                                          | Transactions | XA   | Savepoints |
+--------------------+---------+--------------------------------------------------------------------------------------------------+--------------+------+------------+
| MRG_MyISAM         | YES     | Collection of identical MyISAM tables                                                            | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables                                        | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                                                            | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                                                               | NO           | NO   | NO         |
| SEQUENCE           | YES     | Generated tables filled with sequential values                                                   | YES          | NO   | YES        |
| Mroonga            | YES     | CJK-ready fulltext search, column store                                                          | NO           | NO   | NO         |
| Aria               | YES     | Crash-safe tables with MyISAM heritage                                                           | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, foreign keys and encryption for tables | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                                                               | NO           | NO   | NO         |
+--------------------+---------+--------------------------------------------------------------------------------------------------+--------------+------+------------+

MariaDB [(none)]> show variables like 'mroonga_libgroonga_version';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| mroonga_libgroonga_version | 5.1.2 |
+----------------------------+-------+

MariaDB [(none)]> show variables like 'mroonga_version';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| mroonga_version | 5.12  |
+-----------------+-------+

tokenizerの動作確認。

MySQLで高速全文検索を実現するMroongaでTokenMeCabが使えないときの対処方法
http://qiita.com/groonga/items/58220bfa6b2a990f5cd2
MariaDB [test]> select mroonga_command("tokenize TokenMecab '東京都'");
+----------------------------------------------------------------------------------------------------------+
| mroonga_command("tokenize TokenMecab '東京都'")                                                          |
+----------------------------------------------------------------------------------------------------------+
| [{"value":"東京","position":0,"force_prefix":false},{"value":"都","position":1,"force_prefix":false}]    |
+----------------------------------------------------------------------------------------------------------+

normalizerの動作確認。

groonga/mroongaの文字列正規化機能 (normalizer) の挙動を追ってみる
http://y-ken.hatenablog.com/entry/mroonga-normalizer-behavior
MariaDB [test]> select mroonga_command('normalize NormalizerAuto ブラックふらつくバルスパルスaABCaABC') as result\G
*************************** 1. row ***************************
result: {"normalized":"ブラックふらつくバルスパルスaabcaabc","types":[],"checks":[]}

とりあえず動いている模様。