🎉
ElasticSearchの環境をDockerを使って構築してみる
業務で ElasticSearch を使ったので、備忘録的に書いていこうと思います。
書かないこと
- Docker について
ElasticSearch とは
Elasticsearch は、オープソースの高スケーラブルな全文検索および分析エンジンです。大容量のデータをすばやく、ほぼリアルタイムで保存、検索、分析できます。通常、検索の機能と要件が複雑なアプリケーションを強化する基礎となるエンジン/技術として使用されます。
基本概念
- cluster
- 1 つの cluster の中に複数の index を含めることができます。名前が重要になります。デフォルトは elasticsearch
別環境では同じクラス名にしてはいけない。再利用してしまうと、ノードを間違ったクラスタに入れてしまう可能性があるため。
例えば、開発環境・テスト環境・本番環境で分けるには、cluster-dev
,cluster-stg
,cluster-prod
など名前付けするよう必要がある。
- 1 つの cluster の中に複数の index を含めることができます。名前が重要になります。デフォルトは elasticsearch
- node
- データを保存するためのサーバです。デフォルトでは、起動時にノードに割り当てられるランダムなユニバーサル固有識別子(UUID)になります。
- document
- index の情報を格納するデータ。ドキュメントに対してインデキシング、検索、更新、および削除の操作を実行する際にインデックスを参照します。
- index
- インデックスを付けられる情報の単位です。document を入れる箱。json 形式で表せる。
ざらっとこんな感じでまとめてみました。
詳細はこちらを確認ください。
設定環境
- Docker:20.10.12
- ElasticSearch: 7.16.2
今回は Docker 環境で構築します。
FROM docker.elastic.co/elasticsearch/elasticsearch:7.16.2
# 日本語解析をするための入れます。
RUN elasticsearch-plugin install analysis-kuromoji
以下 docker-compose です。
今回は、web から ElasticSearch を確認するために kibana もいれました。
今回はシングルノードで構築してみました。
version: "3"
services:
es01:
build: .
container_name: es01
environment:
- xpack.security.enabled=false
- discovery.type=single-node
ulimits:
memlock:
soft: -1
hard: -1
ports:
- 9200:9200
# kibana
kibana:
image: docker.elastic.co/kibana/kibana:7.16.2
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://es01:9200
ここまでできたら、起動してみます。
$ docker compose up -d
起動確認
以下の curl を実行し、このように表示されれば ok です。
> curl -X GET "localhost:9200/_cat/health?v&pretty"
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1649794165 20:09:25 docker-cluster green 1 1 8 8 0 0 0 0 - 100.0%
ちなみに、kibana で確認すると以下の感じになります。
こっちのほうが見やすいですね。
インデックスの作成
以下ののように実行します。
PUT /customer?pretty
GET /_cat/indices?v
curl で実行するには以下のように実行します。
$ curl -X PUT "localhost:9200/customer?pretty"
データの挿入
先程作成した index にデータを挿入してみましょう
PUT /customer/external/1?pretty
{
"name": "John Doe"
}
作成すると以下のような結果が返却されます。
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
GET してみると以下のような結果が返却されます。
{
"_index" : "customer",
"_type" : "external",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "John Doe"
}
}
まとめ
GET と PUT をやってみましたが、いかかでしょうか?
ローカル環境で ElasticSearch を作ると結構めんどくさいと思いがちですが、
Docker を使うと非常に簡単になりますね
Discussion