GitLabとElasticsearchを組み合わせたGitLab Advanced Searchをセットアップする

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そのものは無料で使用できます。有償オプションや有償のマネージドサービスなどもあります。詳しくは次のサイトをご覧ください。

Elastic

Elasticsearchは分散型でRESTful、無料かつオープンな検索/分析エンジンです。スピードや水平スケール性、…

本記事ではマネージドサービスは使用せず、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 も使用可能です。

GitLab

Enjoy a free 30-day trial of GitLab and experience the full …

Advanced Searchの設定手順は以下の通りです。

(1) GitLabの管理者エリアを開きます。

(2) 「設定」の「Advanced Search」を選択します。

GitLabの設定のAdvanced Searchを選択する

(3) 「Advanced Search」の「展開」をクリックします。

展開をクリックする

(4) 「Elasticsearch Indexing」をオンにし、「URL」にElasticsearchのURLを入力します。上記の docker-compose.yml で指定したポート番号は 9200 です。

Elasticsearch Indexingをオン、ElasticsearchサーバーのURLを指定する

私の場合は Hyper-V で動かした Ubuntu Linux Seaver にセットアップしていて、内部のDNSサーバーにホスト情報を登録して運用しています。Hyper-V を使った Ubuntu Linux Server のセットアップ方法については以下の記事をご覧ください。

関連記事

Hyper-Vを使い、仮想マシンに Ubuntu Server をインストールする方法を解説します。この記事では Windows Server 2016 を使用しています。Hyper-V が既にインストールされていることを前提にしています。[…]

(5) 下の方にスクロールして、「Enable kuromoji custom analyzer: Indexing」をオンにします。

Enable kuromoji custom analyzer: Indexingをオンにする

(6) 「変更を保存」をクリックします。

(7) 上の方にある「全プロジェクトをインデックス」ボタンをクリックします。これによりインデックスの再構築が開始されます。

「Search with Elasticsearch enabled」と「Enable kuromoji custom analyzer: Search」をオンにし、「変更を保存」ボタンをクリックします。これによりAdvanced Searchを使った検索が有効化されます。

Advanced Searchを使って検索する

ベーシック検索と同様に検索ボックスで検索します。

GitLabの検索ボックス

GitLab Advanced Searchが有効となり、高度な検索が有効ですと表示される

Advanced Searchが有効になっていると、検索結果ページの右上に「高度な検索 が有効です。」と表示されます。

最新情報をチェックしよう!