IKS+Postman で Elasticsearch をお気楽に体験してみるメモ

最近、[Elasticsearch](https://ja.wikipedia.org/wiki/Elasticsearch) サービスに関する話をよく聞きます。興味もあったので、ちょっと調べ、軽く試してみました。これはそのメモです。

# Elasticsearch とは

Elasticsearch は OSS の、[Lucene](https://ja.wikipedia.org/wiki/Apache_Lucene) 基盤の分散処理マルチテナント対応検索エンジン、だそうです。全文検索に特化しているとか。以下が理解の参考になりました。

* [3分で分かった気になる、Elasticsearchとは？](https://qiita.com/r548/items/3622048a622d9c0acc05)
* [全文検索エンジン「Elasticsearch」を調べて使ってみた色々まとめ](https://vitalify.jp/blog/2017/02/elasticsearch_matome.html)
* [Elasticsearchって？](https://www.elastic.co/jp/what-is/elasticsearch)
* [はじめての Elasticsearch](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329)
* [初心者のためのRest APIから覚えるElasticsearch](https://qiita.com/_bsoo/items/d880831e644175782ee0)

個人的な第一印象は、テキスト検索が得意な Document DB、に見せかけて中身は形態素解析してるゴリゴリの分散 RDB ではないか、という感じです。外してそうな気もしますがw

さて、実際に試してみましょう！

# IBM Cloud で無料 k8s クラスターを使う

Elasticsearch は各社で様々なサービスを提供していますし、それらを利用した [マネージドサービス](https://www.elastic.co/jp/cloud/) もあるようです。でも今回はお試しなので、手元にある k8s 環境で実行してみましょう。

個人的には [IBM Cloud](https://cloud.ibm.com/) が提供する IKS (IBM Cloud Kubernetes Service) の [30日間 無料クラスター](https://www.ibm.com/cloud/free) を愛用しています。クレジットカードを登録して [従量課金, PAYG アカウント](https://cloud.ibm.com/docs/account?topic=account-accounts&locale=ja) にしないと使えないのですが、他に有料サービスを使わないならば請求はありません。30日後に自動削除されるので、消し忘れても安心。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/af0b95e4-b299-38c3-bb6d-2ac1c12a9ed7.png)
IBM さん太っ腹で、この30日間 無料って何度でも使えるのです(注: 2020年6月現在)。なので使い終わったら削除して、次回また新規作成すればok。つまり使い捨てで、お掃除する必要もない、お試しには最適な環境なのです。ただしクラスターの新規作成には 30～60分ほどかかるので、そこだけ注意が必要。

更にクラスターには「Web端末」機能があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/1b2e7560-82f7-4d63-54f1-61abd40fe559.png)
ibmcloud や kubectl など必要な CLI ツールが導入されたシェル環境を、Webブラウザから利用できます。自分のマシンへのインストール不要で試せるのが嬉しいところ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/4c432e72-b236-55d0-cf0f-0048653dd351.png)

# Elasticsearch 環境のセットアップ

さて、k8s 環境が使えるようになったところで、[k8s 上に ElasticSearch7.1 クラスタを構築してみた](https://hawksnowlog.blogspot.com/2019/06/elasticsearch7-cluster-on-k8s.html) ページを参考に docker ベースで Deployment しましょう。

```shell
kubectl run elasticsearch \
  --image=docker.elastic.co/elasticsearch/elasticsearch:7.1.1 \
  --env="discovery.type=single-node" --port=9200
```

Deployment、ReplicaSet、Pod が作成されているのを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/094d1c44-8177-8ef1-af06-265b6d264ca1.png)

このままでもローカルに試せるのですが、せっかくですから NodePort Service を作成して、インターネット経由でアクセス可能にしましょう。

```shell
kubectl expose deployment elasticsearch --type="NodePort" --port=9200
kubectl get all
ibmcloud ks worker ls --cluster mycluster
```

表示された情報から、Public IP と外部に公開されたポート番号を入手します。最後の Public IP の確認方法は k8s 環境によって違う(今回は IBM Cloud の例)ので、適時確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/cdac93e2-992c-e405-3ce5-7134744c0403.png)
ローカルPCの curl コマンドでインターネット経由のアクセスができることを確認しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/29dd09f8-e015-60bb-e1c3-ec23c68144b7.png)

# Postman で試す

curl だといろいろ面倒なので、ここからは [Postman](https://www.postman.com/) で API を叩きたいとおもいます。まずは先ほどと同じ URL で、ヘルスチェックを実施。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/6c6167b7-b2ac-ee2c-f0a1-a71fa7bc0de5.png)
``_search`` で現在の中身が空であることを確認しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/e073da25-0ed8-8360-b612-54af1d2045ca.png)

## ドキュメントを作成する

さて、 [はじめての Elasticsearch](https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329) にある手順を試していきましょう。まずは _id を指定したドキュメントの作成です。

``PUT`` メソッドに変更し、``/library/_doc/1`` を URL で指定します。ドキュメントの JSON データを送信するため、Body 欄で形式を raw を、種別として JSON を選択して、下のテキスト欄に JSON 形式データをコピペします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/1db93056-4069-465a-ec2a-5210f50997bf.png)
送信し、返ってきた結果の ``result`` 欄が ``"created"`` になっていればドキュメントが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/093a7ebd-24df-559b-3b21-fedef87a257f.png)
もう一度 ``_search`` を実行して、作成されたドキュメントを得られることを確認しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/6c6ca140-2364-e10a-c340-8b0b89a651db.png)

## ドキュメントを部分的に更新

後は手順を参考に、いろいろ試していきましょう。例えばドキュメントを部分的に更新して、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/d7b72bac-b172-4f5b-6b22-e979d775b977.png)
更新されたドキュメントを確認してみたり。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/0751c6a6-f7e5-102c-c695-70dd0c16b7a6.png)

## ドキュメント検索の準備

これも手順にあるものです。まず既存のドキュメントを削除します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/c4f70aed-cf0a-98a8-f8b0-040a38254dd2.png)
``/library/_bulk`` リクエストでドキュメントを一気に作成し、結果でエラーが無いことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/9aad3ee5-50b0-85cc-f187-562bf0b96b39.png)

## ドキュメント検索

後はいろんなパラメータを指定して検索機能を試せます。例えばタイトルに "fox" が含まれるドキュメントは4つ結果が返ってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/2938bd28-f89b-a90d-3e8b-0eb54abcb8f9.png)
手順にある AND 検索を試してみた結果がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/193519/4a5367df-4fee-1932-91b7-5068cec42915.png)

# お掃除

k8s は試した後のお掃除も楽でいいですね。以下で作成したリソースを削除します。

```shell
kubectl delete service elasticsearch
kubectl delete deploy elasticsearch
```

まあ、IKS 無料クラスターの場合は、単にクラスター削除すれば良いだけなのですがw

# というわけで

Elasticsearch を簡単にですが、実際に試してみました！

各種の解説文やドキュメントを読みつつ、サンプルを自分で試してみるのが理解の早道だとおもいます。単に読んでいるだけだと、無意識に読み飛ばしちゃったり、寝ちゃってどこまで読んだか忘れてしますので(僕だけかも…)。

参考にさせていただいた資料が素晴らしいので、このメモ自体の情報量は薄めなのですが。誰か一人でも「簡単そうなので、やってみよう！」と思っていただければ、メモ公開した甲斐があるってもんです。

それではまた！