Fessでソースコード検索を手軽に試せるdocker-codesearchを、Fess 15.7に合わせて大きく刷新しました。Fess 15.7とOpenSearch 3.7を組み合わせ、Gitリポジトリをクロールしてソースコードを全文検索できる環境を、docker compose upだけで立ち上げられるようにしています。
今回のポイントは、Fess 15.7で追加された静的テーマ(Static Theme)の仕組みを活用し、ソースコード検索の見た目を分かりやすくしたことです。デフォルトで採用している「Code Search」テーマでは、各検索結果を1ファイルごとのコードカードとして表示し、言語バッジや行番号付きのコードスニペットを備えたGitHubのコード検索に近い画面になっています。これにより、どのリポジトリのどのファイルがヒットしたのかが一目で分かるようになりました。
ソースコード検索とdocker-codesearch
FessはOpenSearchをバックエンドに持つオープンソースの全文検索サーバーです。docker-codesearchは、そのFessをソースコード検索サーバーとして仕立てるためのDocker Compose環境で、自前でホストできるコード検索基盤として使えます。
ソースコードの取り込みにはfess-ds-gitデータストアプラグインを利用します。指定したGitリポジトリをクローンしてファイルを順にインデックスし、リポジトリ名・組織名・パスといったメタデータや、拡張子から判定した言語(filetype)を各ドキュメントに付与します。あわせて各行に行番号を付けてインデックスするため、検索画面側で行番号付きのコードスニペットを表示できるようになっています。
必要な環境
- Docker および Git
- Linuxの場合はOpenSearch向けに
vm.max_map_countを262144以上に設定(Docker Desktopでは自動設定)
利用する主なコンポーネントは以下のとおりです。
- Fess 15.7.0
- OpenSearch 3.7.0(fess-opensearch)
- fess-ds-git 15.7.0
イメージのバージョンは.envで一元管理しており、アップグレード時はここのFESS_VERSIONとOPENSEARCH_VERSIONを書き換えます。
FESS_VERSION=15.7.0
OPENSEARCH_VERSION=3.7.0
セットアップと起動
リポジトリをクローンし、セットアップスクリプトを実行してから起動します。
git clone https://github.com/codelibs/docker-codesearch.git
cd docker-codesearch
bash ./bin/setup.sh
docker compose up -d
bin/setup.shは、データディレクトリの作成、fess-ds-gitプラグインの取得、静的テーマの同期、そしてsystem.propertiesとfess_config.propertiesの生成を行います。初回起動時はインデックスの初期化に少し時間がかかります。準備が整えば、検索画面はhttp://localhost:8080/、管理画面はhttp://localhost:8080/admin(初期アカウントはadmin / admin)でアクセスできます。
Staticテーマでソースコード検索を分かりやすくする
今回の刷新で一番大きいのが、検索画面の作り方を変えたことです。以前は独自のJSPテーマ(fess-theme-codesearchプラグイン)で検索画面を組み、バーチャルホストに紐付けてテーマを切り替えていました。今回はFess 15.7で追加された静的テーマ(HTML/CSS/JavaScriptだけで検索画面を構成できる仕組み)に切り替えています。テーマはfess-themesリポジトリからbin/setup.shが同期します。
テーマの有効化は、system.propertiesの1行だけで行えます。以前のようにバーチャルホストの設定を書く必要はありません。
theme.default=codesearch
デフォルトで採用している「Code Search」テーマは、ソースコード検索に特化した作りになっています。
- 1ファイルごとのコードカード: 検索結果を「組織 / リポジトリ ・ パス」のパンくずと、言語バッジ、行番号付きのコードスニペットとして表示します。マッチした語句はハイライトされ、リポジトリ上の該当箇所を開くリンクも付いています。
- クエリ内の絞り込み修飾子: 検索ボックスに
repo:(リポジトリ)、org:(組織)、path:(パス)、file:(ファイル名)、lang:(言語)といった修飾子を書くと、そのままフィールド検索になります。たとえばrepo:fess lang:javaのように指定できます。 - ファセットによる絞り込み: リポジトリ・言語・組織・パスといったファセットが左側に並び、件数を見ながら多段で絞り込めます。選んだ条件はクエリ文字列に反映されるため、検索結果のURLをそのまま共有できます。
- ダークテーマ主体のIDE風デザイン: コードやパスを等幅フォントで表示するIDEに近い見た目で、ライトテーマへの切り替えにも対応しています。
以前のBootstrapベースの汎用的な検索画面と比べて、コード検索に必要な情報(言語・リポジトリ・行番号・該当箇所へのリンク)が最初から画面に並ぶため、検索結果がぐっと読み取りやすくなりました。
リポジトリの登録とクロール
検索対象のリポジトリは、Fessの公式CLIであるfessctlを使って登録します。docker-codesearchには、GitHubリポジトリを登録するためのbin/register_github.shラッパーも用意しています。デフォルトブランチの自動判定に対応し、冪等に登録できます。
export FESS_ENDPOINT=http://localhost:8080
export FESS_ACCESS_TOKEN=<管理画面のアクセストークン>
# 例: codelibs/fess-suggest を登録
./bin/register_github.sh codelibs fess-suggest
アクセストークンは管理画面の/admin/accesstoken/で発行できます。登録後にクローラーを実行すれば、リポジトリのソースコードがインデックスされ、検索できるようになります。
まとめ
docker-codesearchをFess 15.7 + OpenSearch 3.7に対応させ、docker compose upだけでソースコード検索を試せるようにしました。さらに、Fess 15.7のStaticテーマ「Code Search」を採用することで、1ファイルごとのコードカードや言語バッジ、行番号付きスニペット、repo:やlang:といった修飾子が使えるようになり、ソースコード検索の結果が格段に分かりやすくなっています。
詳細やソースコードはdocker-codesearchを参照してください。