【初心者向け】Elasitcsearchをローカルで動かして理解する

最終更新日: 5月 10, 2023

ローカルでelasticsearchを動かし、具体的にどうやって操作するかを理解するための記事です。業務等で触っていく際の足掛かりになれば幸いです。




Elasticsearchとは

以下、公式サイトより引用です。ざっくり言えば、大量のデータを格納し、それを高速に検索/分析ができるエンジンです。

Elasticsearchは、様々なユースケースを解決する分散型RESTful検索/分析エンジンです。データを一元的に格納することで、超高速検索や、関連性の細かな調整、パワフルな分析が大規模に、手軽に実行可能になります。

まずは立ち上げてみよう

Install Elasticsearch with Docker を参考に、dockerでElasticsearchとkibanaを立ち上げます。kibanaはElasticsearchへの問い合わせをGUIで実行/可視化できるツールです。

また、私は端末(Windows)にGit bashをインストールしています。そのため本記事のコマンドはbashとなっています。

というわけで適当にフォルダを作成&移動して、dockerの準備を行います。

$ mkdir test
$ cd test
$ vi docker-compose.yml ※docker-compose.ymlの作成。viコマンドについては割愛。

docker-compose.ymlの中身

version: "3.4"
services:
  elasticsearch:
    container_name: demo-elasticsearch
    image: elasticsearch:8.7.1
    ports:
      - 9200:9200
    environment:
      - discovery.type=single-node
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPT=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
  kibana:
    container_name: demo-kibana
    image: kibana:8.7.1
    environment:
      - "ELASTICSEARCH_HOST=http://elasticsearch:9200"
    ports:
      - 5601:5601

いくつか設定を行っています。各設定については以下を参照ください。
elasticsearch docker image 参考
“discovery.type” 参考
“bootstrap.memory_lock” 参考
“ES_JAVA_OPT” 参考
“ulimits” 参考
“ELASTICSEARCH_HOST” 参考

いざ起動。

$ docker-compose up -d

うまく起動していればpsコマンドでコンテナの状況を確認できます。

$ docker ps

CONTAINER ID   IMAGE                 COMMAND                   CREATED          STATUS          PORTS                              NAMES
bd471d64d85c   kibana:8.7.1          "/bin/tini -- /usr/"   47 minutes ago   Up 47 minutes   0.0.0.0:5601->5601/tcp             demo-kibana
a5828aaa0ec7   elasticsearch:8.7.1   "/bin/tini -- /usr/"   47 minutes ago   Up 47 minutes   0.0.0.0:9200->9200/tcp, 9300/tcp   demo-elasticsearch

elasitcsearchを操作するため、kibana(http://localhost:5601/)にアクセスします。

初回起動時はenrollment-tokenなるものが必要なようです。

指示に従い、create-enrollment-tokenコマンドを発行します。今回はコンテナでelasticsearchを立てているので、コンテナにコマンドを実行させます。.batはwindows実行時のものなので削除して

$ docker exec a5828aaa0ec7 bin/elasticsearch-create-enrollment-token --scope kibana

WARNING: Owner of file [/usr/share/elasticsearch/config/users] used to be [root], but now is [elasticsearch]
WARNING: Owner of file [/usr/share/elasticsearch/config/users_roles] used to be [root], but now is [elasticsearch]
eyJ2ZXIiOiI4LjcuMSIsImFkciI6WyIxNzIuMTguMC4yOjkyMDAiXSwiZmdyIjoiNTY2YzEwNmQ4MjYyZjZkOTI5Zjg5ZjU1N2I0...

※”a5828aaa0ec7″の部分は、docker psコマンドの結果に記載されているdemo-elasticsearchのCONTAINER IDを記載します。

生成したtokenをそのまま貼り付け。

Configure Elasticを押下します。

Verificationが必要とのことで、こちらも指示に従いkibana-verification-codeコマンドを発行します。こちらはkibanaのコンテナで。

$ docker exec bd471d64d85c bin/kibana-verification-code

Your verification code is:  634 0XX

結果を入力してVerifyを押下。

最後の関門です。デフォルトユーザ(elastic)のパスワードをリセットしてパスワードを取得します。

$ docker exec -it a5828aaa0ec7 bin/elasticsearch-reset-password -u elastic

This tool will reset the password of the [elastic] user to an autogenerated value.
The password will be printed in the console.
Please confirm that you would like to continue [y/N]y

Password for the [elastic] user successfully reset.
New value: R8FWqqyAU...

アカパスを入力してログイン!

今回はDevToolsから操作します。

とうとう触れます…!

【index】データ登録

ElasticsearchはREST APIを提供しています。kibanaを通してこのAPIをコールします。Elasticsearchではデータベースのレコードに相当するものをDocumentと表現します。Documentを操作するAPIはDocument APIsにまとめられています。

データ登録はIndex APIで行います。

put demo-index/_doc/1
{
  "test":"aaa"
}

左のエリアに記載したら”▶”を押下すると実行され、右側に結果が表示されます。

登録したデータを検索してみましょう。検索はSearch APIを使います。

get demo-index/_search
{
  "query":{
    "match": {
      "test": "aaa"
    }
  }
}

実行すると、検索結果が右に表示されます。hitsの下が実際のデータで、_source配下に先ほど登録したデータが格納されています。

Elasticsearchはデータベースでいるcreate tableを行わなくてもデータの登録が可能です。データの方も自動で判定してくれています。データベースでいうテーブルはElasticsearchではindexと表現されます。テーブル定義、つまりindex定義はmappingと表現されます。

ついでに自動で生成されたindexの定義を見てみましょう。Get Index APIを使用します。

get demo-index

type:textで作成されています。というわけでCRUDの残りを。

【update】データ更新

Update APIを使用します。

POST demo-index/_update/1
{
  "script" : {
    "source": "ctx._source.test += params.test",
    "params" : {
      "test" : "bbb"
    }
  }
}

実行してから検索すると、aaaでは検索できなくなっています。aaabbbだと結果が表示されます。

【delete】データ削除

Delete APIを使用します。

delete demo-index/_doc/1

こちらも実行してから検索すると、存在しなくなってることが確認できます。

【read】データ取得

最後にGet APIを使用して特定Documentの取得を行います。SQLでいうとwhere句でPrimaryKeyを指定するイメージです。

get demo-index/_doc/1

左側9行目の登録を再度行ってから実行すると、データが取得できます。