ククログ

株式会社クリアコード > ククログ > ハンズオン: Redmine環境に高速な全文検索プラグインを導入してみよう(PostgreSQL編)

ハンズオン: Redmine環境に高速な全文検索プラグインを導入してみよう(PostgreSQL編)

Redmineを高速全文検索するプラグインの開発に参加している児玉です。 ククログではこれまで何度かこのプラグインについてご紹介してきましたが、今回はDebian/Ubuntu向けハンズオン形式で「手を動かして」実際に導入するまでを紹介します! (他のOSをお使いの場合は、適宜コマンドやリポジトリ登録方法を読み替えて進めてください。)

はじめに

チケット数が増えてきてRedmineの検索がもっさりしてきていませんか? そんな方に向けて、本ハンズオンでは既存のRedmine+PostgreSQL環境に対して、全文検索プラグインを導入し、「サクサク検索」を体験する手順を解説します。(MySQLとMariaDBに関しても対応していますが、今回はPostgreSQLに注目して話します。)

なお、本手順で使うバージョンは以下の通りですが、古いバージョンをお使いの方やバージョンアップからサポートが必要な場合は、お気軽にお問い合わせください!

注意: 本ハンズオンを実施する前に、データベースのバックアップを必ず取得してください。

今回の実践環境

  • Ubuntu 24.04 LTS (Noble Numbat)
  • Ruby 3.3.8
  • Redmine 6.0.5
  • PostgreSQL 17.5

ハンズオンの流れ

次の手順で、ハンズオンを進めていきます!

  1. PostgreSQLの拡張機能であるPGroongaをインストール
  2. PostgreSQLでpgroonga拡張を有効化
  3. 全文検索プラグインのインストール
  4. 全文検索プラグインの設定
  5. 既存データを検索対象に登録
  6. 動作確認

1. PostgreSQLの拡張機能であるPGroongaをインストール

今回は、PostgreSQL Global Development Group(PGDG) が提供するPostgreSQL 17.5パッケージを利用する場合の手順を紹介します。 システム標準のPostgreSQLをお使いの場合は、こちらのPGroongaインストール手順を参照してください。

# 基本ツールをインストール
$ sudo apt install -y -V ca-certificates lsb-release wget

# Groonga リポジトリを登録
$ wget https://packages.groonga.org/ubuntu/groonga-apt-source-latest-$(lsb_release --codename --short).deb
$ sudo apt install -y -V ./groonga-apt-source-latest-$(lsb_release --codename --short).deb

# パッケージ更新
$ sudo apt update

# PGroonga インストール
$ sudo apt install -y -V postgresql-17-pgdg-pgroonga

# MeCab トークナイザをインストール(類似チケット検索に利用するため)
$ sudo apt install -y -V groonga-tokenizer-mecab

ここで「なぜPGroongaが必要なの?そもそもPGroongaってなんなの?」という方のために軽く補足します。

なぜPGroongaが必要なのか?

本プラグインは、Redmineの検索クエリをPGroongaで処理することでサクサク検索を実現しています。 なので、PGroonga未導入のままプラグインだけを入れても、検索速度は改善されません。 サクサク検索を有効にするにはPGroongaを組み込むことが必須となっています。

PGroongaとは?

PGroonga(ぴーじーるんが)は、PostgreSQLの拡張機能です。 インデックスにGroongaを利用しているのが特徴です。 これにより、全言語対応の超高速全文検索をPostgreSQL上で手軽に使えるようになります。詳しくは公式ドキュメントや、 こちらの解説記事をぜひご覧ください。

2. PostgreSQLでpgroonga拡張を有効化

次のSQLでPostgreSQLのRedmine用データベースでpgroonga拡張を有効にします。 Redmineで利用しているユーザーで実行してください。(ハンズオンでは、postgresユーザで進めますが、ご自身の環境に合わせてユーザーを指定してください。) 対象のデータベースをredmineとしていますが、ご自身の環境に合わせたデータベースを指定してください。

$ sudo -u postgres psql -d redmine -c "CREATE EXTENSION IF NOT EXISTS pgroonga;"

次のSQLでpgroonga拡張が有効化されているかを確認できます。 extnameとして、pgroongaが表示されていたら有効になっています!

$ sudo -u postgres psql -d redmine -c "SELECT extname, extversion FROM pg_extension WHERE extname = 'pgroonga';"
 extname  | extversion
----------+------------
 pgroonga | 4.0.1
(1 row)

3. 全文検索プラグインのインストール

全文検索プラグインをクローンし、利用しているRedmineにプラグインとしてインストールします。

# Redmine リポジトリに移動(ご自身のプロジェクトディレクトリに読みかえてください。)
$ cd redmine-6.0.5

# 全文検索プラグインをクローンしプラグインディレクトリに配置
$ git clone https://github.com/clear-code/redmine_full_text_search.git plugins/full_text_search

# 依存ライブラリのインストール
$ bundle install

# マイグレーション(全文検索プラグインに必要なテーブルを追加)
$ RAILS_ENV=production bin/rails redmine:plugins:migrate

最後に、全文検索プラグインが読み込まれるよう、Redmineを再起動します。 読み込まれていることは次のコマンドで確認できます。 Redmine pluginsに、full_text_searchが表示されていたら読み込まれています!

$ RAILS_ENV=production bin/about
Environment:
  Redmine version                6.0.5.stable
  Ruby version                   3.3.8-p144 (2025-04-09) [x86_64-linux]
  Rails version                  7.2.2.1
  Environment                    production
  Database adapter               PostgreSQL
  Mailer queue                   ActiveJob::QueueAdapters::AsyncAdapter
  Mailer delivery                smtp
Redmine settings:
  Redmine theme                  Default
SCM:
  Git                            2.43.0
  Filesystem
Redmine plugins:
  full_text_search               2.0.2

次に、全文検索プラグインの設定を見ていきます。

4. 全文検索プラグインの設定

Redmine管理画面 -> プラグイン -> Full Text Searchでプラグインの各設定項目を確認・変更できます。 通常利用時はそのままでも問題ありませんが軽く各項目について紹介します。

  • スコアを表示: 検索時に検索結果のスコアを表示します。(各検索結果の関連度(マッチ度)を数値で確認できます。)
  • 類似チケットを表示: チケット詳細画面に類似するチケットを表示します。
  • トラッキングを有効化: 検索チューニング用の情報を収集します。(無効にすることで、検索結果から遷移した先のURLから検索パラメータを削除できます。)

次の項目は、ChupaText serverを利用して添付ファイルの内容も検索対象にする場合に設定する項目になります。 ChupaText serverの利用に関しては、今回のハンズオンでは触れませんがこちらを参考にしてください。

  • 添付ファイルから抽出する最大テキストサイズ
  • テキスト抽出処理のタイムアウト時間(秒)
  • 外部コマンドの最大使用可能メモリー
  • ChupaTextサーバーのURL

5. 既存データを検索対象に登録

全文検索プラグインをインストール・設定しただけでは、新規に登録される情報のみが検索対象になります。 既存のデータ(過去のチケットやWiki、コメント)の同期を行っていないと、全文検索の対象にならず検索でヒットしないため、必ず最初に次のコマンドで既存データの同期を行い、検索対象に登録してください。

以下のコマンドを何度か実行し、同期対象がなくなるまで繰り返します。

# Redmine リポジトリに移動(ご自身のプロジェクトディレクトリに読みかえてください。)
$ cd redmine-6.0.5

# 既存データの同期を行い検索対象に登録する。
$ RAILS_ENV=production bin/rails full_text_search:synchronize
$ RAILS_ENV=production bin/rails full_text_search:synchronize
# ...対象なしになるまで

具体的には次のように、FullTextSearch::Target:All [] 0/0(100%)とターゲットが0/0になりましたら、 同期完了です!

$ RAILS_ENV=production bin/rails full_text_search:synchronize
┌ FullTextSearch::Target:All [] 0/0(100%)  0s  0.00/s  0s
└── Journal:New [==] 2/2(100%)  0s 22.39/s  0s
# ...他の項目が続く

注意: データ量が多い場合、既存データの同期には時間がかかります。実行中は同期処理が止まらないようにバックグラウンドで動かすか、業務時間外に実行するのをおすすめします。

6. 動作確認

既存データを検索対象に登録したら、実際に検索を実行して「サクサク検索」を体感しましょう。Redmineにログインして、画面右上またはサイドバーの検索ボックスから検索を実行してみてください。従来のRedmine検索で遅さを感じていた方なら、体感で検索速度の変化を実感できるはずです。

他にも次のような項目を確認してみてください。

  • 検索ワードのハイライト
    • 検索結果にて検索ワードがハイライトされ、ヒット箇所が一目でわかること。
  • スコア表示
    • プラグイン設定で「スコアを表示」を有効にした場合、検索結果にスコア(マッチ度)が表示されること。
  • 類似チケット表示
    • プラグイン設定で「類似チケットを表示」にチェックを入れていると、チケット詳細画面に関連度の高いチケットが表示されること。

まとめ

以上でPGroongaのインストールから全文検索プラグインの導入、既存データの同期、動作確認までの一連の流れは完了です。 実際に「サクサク検索」を体感できたのではないでしょうか。

ただ、「ではどれくらい速いのか?」と実際の値が気になる方も多いと思います。 本記事では、Redmine上での性能比較は行っていませんが、PGroongaのパフォーマンスを把握したい方は、次のベンチマーク記事も合わせてご覧ください!

最後に、Redmineのバージョンアップや導入支援、機能のカスタマイズなど検索機能にかかわらずご相談があれば、いつでもクリアコードまで気軽にお問い合わせください。