レビュー

高速日本語全文検索「Mroonga」で編集部の専用過去記事検索を爆速化し作業効率を上げてみた


GIGAZINEでは新しい記事を作成する際に過去に同じ内容の記事がないかチェックしています。2021年8月の時点で7万件以上存在する記事の中から標準で用意している検索フォームで検索すると、結果が返ってくるまでの時間が遅く作業効率が悪くなるという問題が発生していました。そこで、過去記事を素早く検索するための検索システムを作成してみました。

既存のシステムに影響を与えないように、新たに高速で検索できるデータベースアプリケーションを組み込んだサーバーを用意します。今回は、Ubuntu Server 20.04.2 LTS上にMroongaを用意しました。

Mroonga - MySQLで高速日本語全文検索
https://mroonga.org/ja/

インストール手順を参考に設定してインストールします。

universeリポジトリーとセキュリティアップデートリポジトリを有効にします。

$ sudo apt-get install -y -V software-properties-common lsb-release
$ sudo add-apt-repository -y universe
$ sudo add-apt-repository "deb http://security.ubuntu.com/ubuntu $(lsb_release --short --codename)-security main restricted"


「ppa:groonga/ppaレポジトリ」をシステムに追加。

$ sudo add-apt-repository -y ppa:groonga/ppa
$ sudo apt-get update


MariaDB用のMroongaをインストール。

$ sudo apt-get install -y -V mariadb-server-mroonga


groonga-tokenizer-mecabをインストール。

$ sudo apt-get install -y -V groonga-tokenizer-mecab


デフォルトのtokenizerをMeCabにするため設定ファイルを編集します。

$sudo vi sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
mysqld項目内に
mroonga_default_tokenizer=TokenMecab
を追加 。


その他、環境に合わせてキャッシュやログなどの項目のカスタマイズやセットアップを行った後、動作確認をしてみます。

$ sudo mysql -u root
> select mroonga_command("tokenize TokenMecab '東京都'");
mroonga_command("tokenize TokenMecab '東京都'")
(メッセージ等略)
1 row in set (0.023 sec)


この環境に、GIGAZINEの記事を入れるデータベースを作成し、記事内容やタイトルなどを随時追加・更新するテーブルを用意します。このテーブルのストレージエンジンを「mroonga」に指定します。

例:
> CREATE TABLE [テーブル名] (項目1,項目2,…) ENGINE=Mroonga;


高速で検索をしたい項目のインデックスをフルテキストインデックスに設定します。

例:
> alter table [テーブル名] add fulltext index [インデックス名] (項目) COMMENT 'tokenizer "TokenMecab"';


この様にして過去記事の内容を高速で検索するデータベースを作成しました。実際にどれくらい検索時間が違うのか実験してみます。

既存のデータベースで「マクドナルド」を検索すると6.87秒かかりました。

> select count(*) from article_data where data like "%マクドナルド%";
+----------+
| count(*) |
+----------+
| 1136 |
+----------+
1 row in set (6.87 sec)


高速検索システムで「マクドナルド」を検索すると、0.00秒とあっという間に結果が表示され高速検索の威力を実感できます。

> SELECT count(*) FROM article_data WHERE MATCH(data) AGAINST("+マクドナルド" IN BOOLEAN MODE);
+----------+
| count(*) |
+----------+
| 1086 |
+----------+
1 row in set (0.00 sec)


この高速検索データベースを利用した検索ページを編集部専用の管理画面に用意することで検索効率が格段にアップしました。


GIGAZINEでは記事作成だけでなく、このように作業効率を上げるための開発も日々行っています。

なお、GIGAZINEは現在求人中で、こうした内容に興味がある人を募集しています。応募お待ちしています。

GIGAZINE採用情報. – GIGAZINEだからできることが、ある。
https://gigazine.co.jp/

この記事のタイトルとURLをコピーする

・関連記事
過去のリンクが危険なサイトに乗っ取られているのを検知するシステムの作成方法 - GIGAZINE

物議を醸しているAppleの写真スキャンで「偶然の一致」の実例が報告される - GIGAZINE

無料でAWSの料金をチェックして無駄を見つけてくれるサービス「Vantage」を使ってみた - GIGAZINE

肉眼で画像の再利用・加工を行う不正な論文を見抜くスペシャリストとは? - GIGAZINE

データベースの文字数制限が191文字になっている理由とは? - GIGAZINE

A/Bテストでの見出し変更で判明した「人気記事」を作り出すコツとは?ニューヨーク・タイムズの場合 - GIGAZINE

in レビュー,   ソフトウェア, Posted by darkhorse_logmk

You can read the machine translated English article here.