待ってた、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)