mariaDB10.0.21でmroongaを使ってみる

More than 1 year has passed since last update.


待ってた、Mroongaのプリインストール

受託屋さんとしては本当に心待ちにしておりました。

10.0からもう入ってたらしいですね。

インストール作業でいつも何かバージョンが合わずにハゲそうになった日々。

それももう遠い昔。今後はもうこのバージョン以降しか使わない。そう決めました。

環境はRedhat系、yumが使えるやつです。

この記事はAmazonLinuxで作業したログです。


早速使ってみる


mariaDBのインストール

rpmでmariadbをインストールしましょう。

リポジトリ追加した後リポジトリのファイルを作成します。

本家の手順はこちら→ https://mariadb.com/kb/ja/yum/

sudo rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

vi /etc/yum.repos.d/mariadb.repo

.repoファイルの中身

[mariadb]

name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

ではインストール。

yum install openssl-libs

yum install MariaDB-devel MariaDB-client MariaDB-server
/etc/init.d/mysql start
mysql -u root

つながったかな?

では、次はMroonga編。


Mroongaプラグインを有効にする

MroongaはMariaDBをインストールしただけでは使えません。

プラグインを有効化する必要があります。

INSTALL PLUGIN Mroonga SONAME 'ha_mroonga.so';

CREATE FUNCTION last_insert_grn_id RETURNS INTEGER SONAME 'ha_mroonga.so';
CREATE FUNCTION mroonga_snippet RETURNS STRING SONAME 'ha_mroonga.so';
CREATE FUNCTION mroonga_command RETURNS STRING SONAME 'ha_mroonga.so';
CREATE FUNCTION mroonga_escape RETURNS STRING SONAME 'ha_mroonga.so';

すると、mroongaが有効になっているでしょう。

show egines;

+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| Mroonga | YES | CJK-ready fulltext search, column store | NO | NO | NO |
| FEDERATED | YES | FederatedX pluggable storage engine | YES | NO | YES |
| InnoDB | DEFAULT | Percona-XtraDB, Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.00 sec)


my.cnfの設定

mroongaは、デフォルトだと3文字以上の検索しかできません。

英語圏ではそれで良いのでしょうが、じゃぱにーずな我々には致命的です。

なのでmy.cnfに1文字から検索できるように設定を書き込みましょう。

vi /etc/my.cnf.d/server.cnf

[mysqld]
innodb_ft_min_token_size=1 -- これが大事。

-- これより下はいつも設定している値。参考にどうぞ
innodb_buffer_pool_size=1024M
innodb_log_file_size=1G

server-id=100
character-set-server=utf8
collation-server=utf8_general_ci
max_connect_errors=10000
max-connections=500

設定変えたので再起動。

/etc/init.d/mysql restart


テーブルを作る

以下は、ラッパーモード(元のストレージエンジンは InnoDB)でテーブルを作成する場合で、

search_key に全文検索インデックスを張る例(トークナイザはデフォルトの “TokenBigram")

create table test (

id int,
`search_key` longtext COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT INDEX job_search_key (search_key)
) ENGINE=Mroonga DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
COMMENT = 'engine "InnoDB"';

insert into test values
(1, '隣の客はよく柿食う客だ'), (2, '後ろの客はよく柿食う客だ'),
(3, '隣の客はよく西瓜食う客だ'), (4, 'すもももももももものうち');

じゃあ色々検索してみよう。

MariaDB [test]> SELECT  * FROM test

WHERE
match( search_key ) against('+柿' in boolean mode);
+----+--------------------------------------+
| id | search_key |
+----+--------------------------------------+
| 1 | 隣の客はよく柿食う客だ |
| 2 | 後ろの客はよく柿食う客だ |
+----+--------------------------------------+
2 rows in set (0.00 sec)

MariaDB [test]> SELECT  * FROM test

WHERE
match( search_key ) against('+柿 隣' in boolean mode);
+----+--------------------------------------+
| id | search_key |
+----+--------------------------------------+
| 1 | 隣の客はよく柿食う客だ |
| 2 | 後ろの客はよく柿食う客だ |
| 3 | 隣の客はよく西瓜食う客だ |
+----+--------------------------------------+
3 rows in set (0.01 sec)

MariaDB [test]> SELECT   * FROM  test 

WHERE
match( search_key ) against('+柿 +隣' in boolean mode);
+----+-----------------------------------+
| id | search_key |
+----+-----------------------------------+
| 1 | 隣の客はよく柿食う客だ |
+----+-----------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> SELECT   * FROM  test 

WHERE
match( search_key ) against('+西瓜 +隣' in boolean mode);
+----+--------------------------------------+
| id | search_key |
+----+--------------------------------------+
| 3 | 隣の客はよく西瓜食う客だ |
+----+--------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> SELECT   * FROM  test 

WHERE
match( search_key ) against('+西瓜 +後ろ' in boolean mode);
Empty set (0.00 sec)

MariaDB [test]> SELECT   * FROM  test 

WHERE
match( search_key ) against('+柿 +後ろ' in boolean mode);
+----+--------------------------------------+
| id | search_key |
+----+--------------------------------------+
| 2 | 後ろの客はよく柿食う客だ |
+----+--------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> SELECT   * FROM  test 

WHERE
match( search_key ) against('+すもも' in boolean mode);
+----+--------------------------------------+
| id | search_key |
+----+--------------------------------------+
| 4 | すもももももももものうち |
+----+--------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> SELECT   * FROM  test 

WHERE
match( search_key ) against('+もも' in booleanmode);
+----+--------------------------------------+
| id | search_key |
+----+--------------------------------------+
| 4 | すもももももももものうち |
+----+--------------------------------------+
1 row in set (0.00 sec)

MariaDB [test]> SELECT   * FROM  test 

WHERE
match( search_key ) against('+ももち' in boolean mode);
Empty set (0.00 sec)