さくらVPS上のWEBアプリ(PHP)でMroongaを使って全文検索したい その1

前回の続き。

ここまででとりあえずphpとRDBを使用したWEBアプリは動くようになったはず。今回は、アプリケーション内の全文検索で表記ゆれや別称に対応したいため、Mroongaを導入していきたいと思う。

例によって正直これが何なのかイマイチ理解していないのだが、他に実現方法が見つからなかったのでこれで行くしかない。

前回インストールしたmariaDBが5系だったので10系にアップデートする

公式サイト(https://mroonga.org/ja/docs/install.html)を見る限り5系に対応するパッケージがないのでアップデートしていく。

# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
# systemctl stop mariadb
# yum update mariadb-server -y
# systemctl start mariadb

こうして

# mysql --version

で確認すると、10.6になっている。

ようやくMroongaに手を付ける

次の内容で /etc/yum.repos.d/MariaDB.repo を作る。

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

インストール。

# yum install -y https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm
# yum install -y MariaDB-server
# systemctl start mariadb
# yum install -y --enablerepo=epel mariadb-10.6-mroonga
(# mysqladmin -u root password 'new-password')

トークナイザーとして MeCab を利用したい場合はgroonga-tokenizer-mecabをインストール。

# yum install -y --enablerepo=epel groonga-tokenizer-mecab

これでいけてるはず

インストールチェック。

# mysql -uroot -p

で接続して

SHOW ENGINES;

してもmroongaが出てこなかったので、

# mysql -uroot -p < /usr/share/mroonga/install.sql

としてインストール。再度show engines;すると無事表示された。多分これでインストールされているはず。

 show variables like 'mroonga_version';

で、

+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| mroonga_version | 11.11 |
+-----------------+-------+

こうなったので、11.11がインストールされているように見える。

動かしてみる

今回Mroonga を導入するのは、WEBアプリケーションでDBに蓄積したテキストコンテンツの全文検索で表記ゆれに対応するためというのが大きい。そのためにはまだ色々設定が必要なのだと思うが、とりあえず動くかどうか試してみる。

CREATE DATABASE testdb;
USE testdb;

CREATE TABLE questions (
 id INT PRIMARY KEY AUTO_INCREMENT ,
 content VARCHAR(255),
 FULLTEXT INDEX (content) 
)ENGINE = Mroonga DEFAULT CHARSET utf8mb4 COLLATE=utf8mb4_general_ci;

INSERT INTO questions (content) VALUES ("ありまきねん");
INSERT INTO questions (content) VALUES ("アリマキネン");
INSERT INTO questions (content) VALUES ("ありまっくす");
INSERT INTO questions (content) VALUES ("有馬記念");

SELECT * FROM questions WHERE MATCH(content) AGAINST("+ありま" IN BOOLEAN MODE);
+----+--------------------+
| id | content            |
+----+--------------------+
|  1 | ありまきねん       |
|  3 | ありまっくす       |
+----+--------------------+

動いてはいる。

次回へ続く。

娘にプリキュアの光るパジャマを買ってあげたいのでサポートお願いします!