GitLabには組み込みの検索機能が2種類有ります。Free Tierでも使用可能な通常の検索機能とPremium Tier以上でのみ使用可能なGitLab Advanced Searchという検索機能です。この記事では後者のGitLab Advanced Searchのセットアップ方法や特徴などを解説します。
通常の検索機能とAdvanced Searchの違い
2つの検索機能の大きな違いはインデックスの作成処理と検索機能の実装場所です。通常の検索機能ではGitLab自身が検索のインデックスを作成し、検索機能自体もGitLab自身が提供しています。Advanced Searchはこれらの処理をElasticsearchが行っています。もしかすると、単なるエンジンの違いかぁ〜、と思いましたか?。それだけであれば、有償のPremiumを契約してまで使う必要は無いかなと思ったことでしょう。しかし、GitLabを活用する上で大きな違いとなってきます。
検索エンジンがElasticsearchになることで、次のようなことが可能になります。
- あいまい検索
- プロジェクト横断全文検索
プロジェクト横断全文検索
これがGitLabを活用する上での大きな違いとなります。私自身はこの機能が欲しいが故にGitLab Premiumを契約しているほどです。リポジトリの数が少なければすべてのコードがローカルマシン内にもあるので検索はローカルマシン内で行うだけで十分です。しかし、イシューが増え、コミットログが増え、リポジトリが増え、コードが膨大になり。。。となってくると検索はGitLabのサイト上で行うことが増えてきます。
ベーシック検索機能ではリポジトリを指定して検索することになるので、どのプロジェクトにあるかは把握していないと検索ができません。見つからないから次のプロジェクト、また、次のプロジェクトと切り替えていくのは非効率です。Advanced Searchなら一発で全部のプロジェクトを対象に検索することも、グループを指定してグループ内だけを探すこともできます。検索結果が多ければ、絞ることも簡単です。
例えば、あるライブラリ内の定義を変更したいと考えたときに、その定義を参照しているコードがどの程度あるかを検索して影響度合いを検討することも簡単です。他にも
- 定数の値を検索して、同じ値を定義している別の定数をあるか?
- あるライブラリのバンドルIDを変更したら、どの程度影響するか?
- あるFIFOのパスを変更したら、そのFIFOを参照しているコードはどの程度有るか?
- 同じ設定ファイルを参照するプログラムはあるか?
- 同じサーバーやURLを参照しているコードはあるか?
これらをプロジェクト横断・リポジトリ横断で探せます。
検索対象はコミットログも対象です。コミットログをしっかり書いていますか?書いてあればAdvanced Searchで検索するときに重要な材料になります。
Advanced Searchの制限事項
良いことづくしのように思えるAdvanced Searchですが、制限事項があります。
- 日本語の検索精度が今ひとつ
- 有効になるのはデフォルトブランチのみ
コードのみなのですが、日本語だと上手くヒットしないことが多いです。そのためにMarkdownで書いたドキュメントを検索するときに、日本語のキーワードは上手くヒットしないことがあります。これは改善して欲しい点です。Elasticsearch側の調整が必要な可能性が高いのですが、今のところ、上手く成功していないです。
また、別ブランチを開いているときはベーシック検索になります。
逆にこれらについてはベーシック検索の方が上手く処理できています。
Elasticsearchとは?
ElasticsearchはLuceneを基盤にしたオープンソースの全文検索エンジンです。ElasticsearchはRESTful検索・分析エンジンです。Elatic Stackのコアになる部分です。Elasticsearchそのものは無料で使用できます。有償オプションや有償のマネージドサービスなどもあります。詳しくは次のサイトをご覧ください。
Elasticsearch | オフィシャルの分散型検索/分析エンジン | Elastic | Elastic
本記事ではマネージドサービスは使用せず、Hyper-Vで作った仮想サーバーの中でDockerを使ってコンテナ化して動かします。
Elasticsearchのセットアップ方法
本記事ではDocker Composeで簡単に動かせるようにします。次のように操作します。
(1) 次の内容で Dockerfile
を作成します。指定するバージョンは任意に変更してください。日本語に対応できるように kuromoji を利用するためのプラグインもインストールするように設定します。
FROM docker.elastic.co/elasticsearch/elasticsearch:7.12.1
RUN elasticsearch-plugin install analysis-kuromoji
(2) Dockerfile
と同じフォルダに次の内容で docker-compose.yml
ファイルを作成します。
version: '3'
services:
elasticsearch:
build: .
ports:
- 9200:9200
volumes:
- ./data:/usr/share/elasticsearch/data
- ./config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
environment:
- discovery.type=single-node
kibana:
image: docker.elastic.co/kibana/kibana-oss:7.10.2
ports:
- 5601:5601
(3) docker-compose.yml
と同じフォルダに config
フォルダを作成します。
(4) config
フォルダに次の内容で elasticsearch.yml
ファイルを作成します。
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
(5) コンテナ化して実行します。
% docker-compose up -d
GitLab Advanced Searchの設定
GitLabにElasticsearchへアクセスするための情報を設定します。なお、Advanced SearchはPremium Tier以上を契約しないと使えない機能です。Ultimate Tierのトライアルができるので、実際に試してみるにはトライアルを申し込むのも良いと思います。Ultimate TierはPremium Tierよりも上位のプランなので Advanced Search も使用可能です。
Advanced Searchの設定手順は以下の通りです。
(1) GitLabの管理者エリアを開きます。
(2) 「設定」の「Advanced Search」を選択します。
(3) 「Advanced Search」の「展開」をクリックします。
(4) 「Elasticsearch Indexing」をオンにし、「URL」にElasticsearchのURLを入力します。上記の docker-compose.yml で指定したポート番号は 9200 です。
私の場合は Hyper-V で動かした Ubuntu Linux Seaver にセットアップしていて、内部のDNSサーバーにホスト情報を登録して運用しています。Hyper-V を使った Ubuntu Linux Server のセットアップ方法については以下の記事をご覧ください。
(5) 下の方にスクロールして、「Enable kuromoji custom analyzer: Indexing」をオンにします。
(6) 「変更を保存」をクリックします。
(7) 上の方にある「全プロジェクトをインデックス」ボタンをクリックします。これによりインデックスの再構築が開始されます。
「Search with Elasticsearch enabled」と「Enable kuromoji custom analyzer: Search」をオンにし、「変更を保存」ボタンをクリックします。これによりAdvanced Searchを使った検索が有効化されます。
Advanced Searchを使って検索する
ベーシック検索と同様に検索ボックスで検索します。
Advanced Searchが有効になっていると、検索結果ページの右上に「高度な検索 が有効です。」と表示されます。