GitLabの検索機能を大幅に強化する！AivenのOpenSearchサービスとの連携方法

# なにがうれしいか

## 日本語検索が弱い
GitLabはイシューやマージリクエスト、ソースコード、Wiki機能があり、とても便利ではある。
しかし、日本語キーワードでの検索が弱いため、不便を感じることが多々ある。がんばれ、GitLab!

## Elastic Searchとの連携ができる

GitLabのSelf-Managed版で、Premium版以上を使っている場合、「Advanced Search」機能が使えることをご存知だろうか。
( 残念ではあるが、GitLab CE、GitLab SaaS版では、本記事でのやり方を採用することはできない )

CJK(中国語、日本語、韓国語とか)の世界の検索は、それはそれでレベルが高く、日本人ですら、敷居が高い。ならば、遥か彼方の天空界まで到達している、Elastic様にお願いしようではないか、諸君。

ありがとう、Elastic!
しかし、今回は、Elastic社のクラウドじゃなく、なにやら新しいAivenという北欧の会社のサービスを使ってみる。普通に考えて珍しいと思うが、そういえば、メールサーバーの dovecot( https://www.dovecot.org/ ) も北欧発だったな。私は個人的に A-HA の Take On Me ( https://www.youtube.com/watch?v=djV11Xbc914 )がスキなので、きっとAivenも良い製品だと思う。

なにはともあれ、例を示すので、ぜひ興味をもってもらいたい。

# 実際の検索の様子

## Step.0 : 準備のためにやったこと (GitLab側)

ある程度GitLabを知っている人を対象としているので、準備事項を以下に示す。

1.AWSで c5.xlarge インスタンスを立てる。その時使ったのは、"Amazon Linux"であるが、GitLabのインストールスクリプトが、「Amazon Linux 2」のみ提供されているので、以下の設定のようにインスタンスを作る。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/7a52c38b-bd76-6a86-f7f4-3d6ad1613188.png)
2.言わなくても分かるが、開けておくポートは、22(SSH)と、オレオレSSLは面倒なので、80(HTTP)を開けておいたが、ここは諸君の趣味に任せる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/c8665f67-3914-65e0-bf94-b181dbaf3ceb.png)

ちなみに、このスペックで、500ユーザーまでは余裕でさばけるので、無理して複数構成でセットアップしようなんてことは考える必要ナッシング ( 参考： https://docs.gitlab.com/ee/administration/reference_architectures/1k_users.html )。

それから、Self-Managed用のトライアルライセンスキーを「必ず」設定する必要があるので、ここ( https://about.gitlab.com/free-trial/?hosted=self-managed )から入手して、GitLabに設定する。
設定すると、このように「Admin-Settings-Advanced Search」というメニューが現れるので、それを確認する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/f3da152a-c59c-ff9e-0d56-e5dda2d04597.png)ライセンスキー(トライアルでも、製品版でもよい)を設定しないと、このメニューは現れないので注意。

言わなくても分かると思うが、インストールの手順は、ここの情報で十分( https://about.gitlab.com/install/ )。

## Step.0 : 準備のためにやったこと (Aiven側)

Aiven社のサイトはこちら( https://aiven.io/ )。日本語サイトはこちら( https://aiven.io/ja )。

1.アカウントを開設する。
2.検証なら、無料(300$分)で十分。
3.Aivenは、「プロジェクト」という単位で課金を管理する。つまり、今回はOpen Searchサービスを使いたいのだが、いきなりサービスを作るのではなく、まずは最初にプロジェクトを作成する。そして、そのプロジェクトにぶら下がるイメージで、Open Searchサービスを有効にする。
4.課金、つまり、クレジットカード等については、このプロジェクトに対して、Paymentを紐付け、支払いを行う、という仕組み
5.次のような感じでプロジェクトを作り、さらにサービスも定義していく。どこにどんな構成で作るかは、お金の問題とネットワーク等の遅延など、自分の許容範囲で判断する。無料の300$分があるので、贅沢に使ってしまってもいいかも。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/38d1e4b6-31a4-e716-8b5c-4f5e618eea74.png)
6.サービスの追加は、次のように作る。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/7d177bd4-dea6-b42b-6184-7076ef390bfa.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/0f7a0a24-1771-540b-3812-9f97dd8a0514.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/304e0251-f5c8-18d1-ac3c-9927bbd3f04f.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/5f815ba3-3c16-e404-d2f8-0a09057e972a.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/cf14ed5f-8d0d-cb8f-3ecc-7f0e3cd3aa20.png)
7.最終的にこの画面に到達する。ここにURLと接続用のユーザーIDとパスワードがあるので、後でこれをGitLab側に設定する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/853e84dd-85a9-671f-af22-e74b41bdef67.png)

## Step.1 : 設定 (GitLab側)

では、Advanced Searchの設定をする。

1.[Admin-Settings-Advanced Search]メニューに進み、次の画面を表示させる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/1f183995-4e52-f070-d966-5ac6673d3a59.png)
2.先程、Aiven側で設定したOpen Searchの画面から、「URL」をコピーする。このURLには、ユーザーIDとパスワードが含まれているので、正確にいうと、途中にProxyサーバーがあるとこの情報はダダ漏れになってしまう。とはいえ、検証なのでこれでいく。また、「Elasticsearch indexing」、「Search with Elasticsearch enabled」もチェックする。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/1e61e724-bdeb-ee25-18ea-9771179fd699.png)
3.ちなみに、なにやら日本語に対応してそうな機能があるが、とりあえず、これは触らない。とにかく連携して動くところまで、まず最初に確認しようではないか。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/339cc978-038d-2446-e3eb-a35b38e36522.png)
4.[Save change]で保存する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/475692b6-af18-04bf-5319-37839292610c.png)

## Step.2 : 確認 (Aiven側)

なんと、もうこの瞬間に、Aiven側の画面をみると、設定がうまくいったかどうかが直ぐにわかる。

1.Aiven側でのサービスの画面(さきほどの画面が残っているはず)で、[Indexes]タブをクリックし、スクロールするとつぎのように、gitlab-production-xxxなんとか、みたいなインデックスがわっと作られている。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/ef44d59d-77c7-0100-174b-65e1dbcd9239.png)

めっちゃすばらしい。これで実質、セットアップは終わり。

## Step.3 : 動作確認 (GitLab側)

もうこれで検索はバッチリなので、適当にプロジェクトつくったり、イシューつくったり、Wikiページをつくったりしてみる。

たとえば、次のようなイメージで、実際に検索できるところをご紹介しよう。

1.グループを作ったところ。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/368b23a9-282e-10fa-3e0c-facd67f22203.png)
2.プロジェクトを作ったところ。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/338d5248-3d95-b52c-2cf4-b40ab054250f.png)
3.イシューを作ったところ。テスト用として、「東京特許許可局」をタイトルに指定してみた。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/dcc02c3d-c967-06d8-4518-b3b4d55ddd2e.png)
4.一旦左上のアイコンをクリックして、トップ画面に移動する。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/addc7ffa-9c30-6ae4-4827-a906922fc357.png)
5.検索バーに「東京」を指定する。前方一致が動くかどうかを確認。問題なく動くことを確認。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/fd4b4b2b-4556-8004-e43c-143a8c1aa8d4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/0ceacef5-a616-1458-0582-cf606d98a251.png)
6.今度は途中の「許可」で検索できるかどうかを確認。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/a78a9e8f-81e1-faaa-7836-d06ac96d3c36.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/2f495240-2d6b-f63d-e5ad-9cfdcd56a594.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/17015c3a-ae23-ae1a-64c1-af786dba1abf.png)

ばっちり動作することを確認。

## Step.4 : Advanced Searchを使わない時の動作も確認しておく (GitLab側)

Advanced Search機能を一旦切って、動作を確認してみる。

1.[Admin-Settings-Advanced Search]の設定で、URL等をすべて空欄にして、[Save Changes]をクリック
2.左上のバーで「東京」と、「許可」を両方で検索してみる。両方ともひっかからないことがわかる。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/3e6df9c7-d0e3-df63-27e0-b9505fecdce8.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3325737/5b2efbf0-4685-fcdd-cb3c-125650db2620.png)
3.ちなみに「東京特許許可局」で検索すると、ひっかかる。みなさんもぜひ確認してもらいたい。

ということで、AivenのOpen Search機能を使うと、Elasticの運用から開放され、遅いなーと感じたら、Aiven側でインスタンスサイズを変更すればいいので、かなり楽ちんな感じになる。

GitLabからAiven側へは今回HTTPを使ったが、SSLにし、そしてURLへのIDパスワードの埋め込みではなく、別々の設定にすれば安全に連携も可能。

ちなみに、GitLabをAWSやGCP、Azure等で動作させている場合、VPCのピアリングも可能なので、オンプレミスといいつつ、実態はクラウド上でGitLabを動かしている人は、Aivenを試さない手はない。