🎉

ElasticSearchの環境をDockerを使って構築してみる

2022/04/13に公開

業務で ElasticSearch を使ったので、備忘録的に書いていこうと思います。

書かないこと

  • Docker について

ElasticSearch とは

Elasticsearch は、オープソースの高スケーラブルな全文検索および分析エンジンです。大容量のデータをすばやく、ほぼリアルタイムで保存、検索、分析できます。通常、検索の機能と要件が複雑なアプリケーションを強化する基礎となるエンジン/技術として使用されます。

(Elasticsearch リファレンス引用)

基本概念

  • cluster
    • 1 つの cluster の中に複数の index を含めることができます。名前が重要になります。デフォルトは elasticsearch
      別環境では同じクラス名にしてはいけない。再利用してしまうと、ノードを間違ったクラスタに入れてしまう可能性があるため。
      例えば、開発環境・テスト環境・本番環境で分けるには、cluster-dev, cluster-stg, cluster-prod など名前付けするよう必要がある。
  • 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