Crowi
運用

検索バックエンドのセットアップ

Crowi の全文検索バックエンド (Elasticsearch) のセットアップとインデックス構築

Crowi の全文検索は 検索ドライバ という差し替え可能な仕組みで提供 されます。デフォルトのドライバは mongo で、MongoDB の $regex を 使った検索です。暗黙のデフォルトプラグイン @crowi/plugin-search-mongo として実装されており、追加のインフラを必要としないため、新規インストール でも MongoDB だけですぐに検索できます。

より大規模な構成向けには、Elasticsearch を opt-in で選択 できます。 @crowi/plugin-search-elasticsearch プラグインとして実装されており、 大量の文書でもスケールしやすく、日本語解析 (analysis-kuromoji) にも 対応します。このページは運用者向けに、Elasticsearch ドライバの セットアップとインデックス構築の手順を説明します。利用者向けの検索の 使い方は 検索 を参照してください。

Note: Crowi 2.0 (Reignite) は alpha 開発中で、Elasticsearch バック エンドはまだ調整中です (ES のバージョン更新と、検索ドライバのプラグイン 化)。本ページの手順は現行の dev 環境に基づいていますが、詳細は今後 変わる可能性があります。最新状況は TODO.md を参照してください。

アーキテクチャ概要

  • 検索ドライバはプラグイン経由で SearchRegistry に登録されます。
  • どのドライバを使うかは crowi.config.jsonsearch.driver で指定 します (デフォルトは mongo)。
  • Elasticsearch ドライバの接続情報は、Mongo の Config 名前空間 plugin:@crowi/plugin-search-elasticsearch:* に保存されます。 設定は管理画面のプラグイン設定画面からのみ行います (環境変数からの 自動移行は行いません)。

Elasticsearch プラグインの有効化

デフォルトの mongo ドライバから Elasticsearch に切り替えるには、 ランナープロジェクトの依存に @crowi/plugin-search-elasticsearch を 宣言し、crowi.config.jsonplugins 配列にプラグイン名を加え、 search.driverelasticsearch に設定します。

{
  "plugins": [
    "@crowi/plugin-search-elasticsearch"
  ],
  "search": {
    "driver": "elasticsearch"
  }
}

設定後に api を再起動すると、プラグインがロードされ検索ドライバが 登録されます。プラグインの導入手順全般は プラグインの管理 を参照してください。

Elasticsearch を起動する

開発環境では docker-compose.yml に Elasticsearch サービスが含まれて います。

docker compose up -d

dev 用の Elasticsearch イメージ (elasticsearch.Dockerfile) は、素の Elasticsearch に analysis-kuromoji プラグインをプリインストールした カスタムイメージです。これにより、後述の kuromoji アナライザーが 追加設定なしで使えます。

Caution: dev イメージには日本語形態素解析の analysis-sudachi プラグインは 含まれていませんsudachi アナライザーを使う場合は、 自前で analysis-sudachi プラグインと辞書を組み込んだ派生イメージを ビルドする必要があります。

本番環境では、マネージドの Elasticsearch (Elastic Cloud、Bonsai など) か、 自前で運用する Elasticsearch クラスタを用意してください。

接続情報を設定する

接続情報は管理画面のプラグイン設定画面 (/admin/plugins/edit?name=@crowi/plugin-search-elasticsearch) から設定します。

設定キー説明
urlElasticsearch のエンドポイント。https://[user:pass@]host[:port][/indexName] 形式。URL にパスワードを含められるため、機密値として暗号化されます。空文字のときはドライバは登録されますが無効化されます。
indexNameベースとなるインデックス名 (デフォルト crowi)。URL のパスで指定しない場合に使われます。
requestTimeoutリクエストタイムアウト (ミリ秒、デフォルト 5000)。
analyzerマッピングの種類。default / kuromoji / sudachi から選択。

アナライザーの選択

analyzer 設定で、全文検索のトークナイズ方式を選びます。

アナライザークラスタ要件
default追加の ES プラグイン不要。
kuromojianalysis-kuromoji プラグインが必要。dev イメージにはプリインストール済み。
sudachiサードパーティの analysis-sudachi プラグイン + 辞書が必要。dev イメージには含まれないため、派生イメージのビルドが必須。

日本語コンテンツが主体の Wiki では kuromoji が無難な選択です。 プラグイン未導入のクラスタで kuromoji / sudachi を選ぶと、後述の インデックス再構築 (rebuild()) が失敗します。

インデックスの構築

検索インデックスの全件再構築は、Web の管理画面からではなく crowi-admin CLI で行います。長時間かかる処理を管理リクエストに 紐付けないための設計です。

crowi-admin rebuild search

このコマンドは:

  1. .env を読み込み、MONGO_URI などを Crowi のブート時と同じ経路で 解決します。
  2. アクティブな検索ドライバを解決し、その rebuild() を呼び出します。
  3. Elasticsearch ドライバの場合、タイムスタンプ付きの新しいインデックスを 作成し、全ページを bulk indexing したうえで <indexName>-current エイリアスを新インデックスへ切り替えます。古いインデックスは削除 されます。

crowi-admin は MongoDB に直接接続する運用者向け CLI です。@crowi/api がインストールされたディレクトリ (通常は runner パッケージ) から実行 してください。

Tip: エイリアス方式により、再構築中もダウンタイムなく既存 インデックスへの検索が継続できます。新インデックスの構築完了後に 一括でエイリアスが切り替わります。

ドライバが永続インデックスを持たない場合 (rebuild() を実装しない場合)、 管理画面の Search セクションには再構築のヒントは表示されません。

検索ドライバの状態確認

管理画面の Search セクション (/admin/search) は read-only で、現在 アクティブな検索ドライバとインストール済みドライバの一覧を表示します。 ドライバの切り替えは crowi.config.jsonsearch.driver 変更 + api 再起動で行います。管理画面全般については 管理画面 を 参照してください。

トラブルシューティング

  • url が空でドライバが無効: 接続情報が未設定です。管理画面の プラグイン設定で url を設定してください。url が空のときは query() がエラーを投げ、index() は no-op になります。
  • rebuild が失敗する: kuromoji / sudachi を選んでいるのに対応 する ES プラグインがクラスタに入っていない可能性があります。crowi-admin rebuild search はエラー時に ES クラスタのレスポンス本文を出力するので、 その内容を確認してください。
  • 検索結果が古い / 出てこない: ページ更新時の差分インデックスは 反映されますが、過去データやマッピング変更を取り込むには crowi-admin rebuild search での全件再構築が必要です。

On this page