個人的にElasticsearchでよく使うcurlまとめ

# はじめに

最近、Elasticsearchを使っています。コマンドは基本的にcurlを使っています。しかし、ドキュメントがElasticsearchのバージョンによって違うため探しづらく、curlとJSONを使うので覚えるのも大変だと思ってました。なので、自分でまとめてみました。

# index

## 作成

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-create-index.html

・例

```bash
curl -XPUT localhost:9200/hoge
```

## 確認

●CAT

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-indices.html

・例

```bash
curl localhost:9200/_cat/indices/hoge
```

●settings

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-settings.html

・例

```bash
curl localhost:9200/hoge/_settings
```

## 更新

●settings

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html

・例

```bash
curl -XPUT localhost:9200/hoge/_settings -H 'Content-Type: application/json' -d '{
  "index": {
    "number_of_replicas" : 0
  }
}'
```

●インデックスの名前の変更（reindex）

別名のインデックスが新しく作成されます。

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-reindex.html

・例

```bash
curl -XPOST localhost:9200/_reindex -H 'Content-Type: application/json' -d '{
  "source": {
    "index": "hoge"
  },
  "dest": {
    "index": "new_hoge"
  }
}'
```

## 削除

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-index.html

・例

```bash
curl -XDELETE localhost:9200/hoge
```

# alias

## 作成＆更新

●Create or update

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-add-alias.html

・例

```bash
curl -XPUT localhost:9200/hoge/_alias/hoge-alias
```

●actions

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html

・例

```bash
curl -XPOST localhost:9200/_aliases -H 'Content-Type: application/json' -d '{
  "actions": [{
    "add": {
      "index": "hoge",
      "alias": "hoge-alias",
      "is_write_index": true
    }
  }]
}'
```

## 確認

●CAT

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-alias.html

・例

```bash
curl localhost:9200/_cat/aliases/hoge-alias
```

●GET

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-alias.html

・例

```bash
curl localhost:9200/_aliases
```

## 削除

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-alias.html

・例

```bash
curl -XDELETE localhost:9200/hoge/_alias/hoge-alias
```

# ilm policy

## 有効化／無効化／ステータス

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/start-stop-ilm.html

・例

```bash
curl -XPOST localhost:9200/_ilm/start #有効化
curl -XPOST localhost:9200/_ilm/stop #無効化
curl localhost:9200/_ilm/status #ステータス
```

## 作成＆更新

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-put-lifecycle.html

```bash
curl -XPUT localhost:9200/_ilm/policy/hoge-policy -H 'Content-Type: application/json' -d '{
  "policy": {
    "phases": {
      "delete" : {
        "min_age": "30d",
        "actions": {
          "delete": {}
        }
      }
    }
  }
}'
```

## 確認

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-get-lifecycle.html

・例

```bash
curl localhost:9200/_ilm/policy/hoge-policy
```

## 削除

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/ilm-delete-lifecycle.html

・例

```bash
curl -XDELETE localhost:9200/_ilm/policy/hoge-policy
```

# template

## 作成＆更新

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-put-template.html
legacyバージョン（Elasticsearch7.8より前）
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates-v1.html

・例

```bash
curl -XPUT localhost:9200/_index_template/hoge-template -H 'Content-Type: application/json' -d '{
  "index_patterns": ["hoge"],
  "template":{
    "settings": {
      "index.lifecycle.name": "hoge-policy"
    }
  }
}'
```
legacyバージョン（Elasticsearch7.8より前）

```bash
curl -XPUT localhost:9200/_template/hoge-template -H 'Content-Type: application/json' -d '{
  "index_patterns": ["hoge"],
  "settings": {
    "index.lifecycle.name": "hoge-policy"
  }
}'
```

## 確認

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-templates.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-template.html
legacyバージョン（Elasticsearch7.8より前）
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-template-v1.html

・例

CAT

```bash
curl localhost:9200/_cat/templates/hoge-template
```

GET

```bash
curl localhost:9200/_index_template/hoge-template
```

legacyバージョン（Elasticsearch7.8より前）

```bash
curl localhost:9200/_template/hoge-template
```

## 削除

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-template.html
legacyバージョン（Elasticsearch7.8より前）
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-delete-template-v1.html

・例

```bash
curl -XDELETE localhost:9200/_index_template/hoge-template
```

legacyバージョン（Elasticsearch7.8より前）

```bash
curl -XDELETE localhost:9200/_template/hoge-template
```

# snapshot

## 作成＆更新

●リポジトリ登録

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/put-snapshot-repo-api.html

・例

```bash
curl -XPUT localhost:9200/_snapshot/hoge-repo -H 'Content-Type: application/json' -d '{
  "type": "fs",
  "settings": {
    "location": "/es-backup"
  }
}'
```

●スナップショット取得

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/create-snapshot-api.html

・例

```bash
curl -XPUT localhost:9200/_snapshot/hoge-repo/snapshot_$(date "+%Y%m%d")?wait_for_completion=true -H 'Content-Type: application/json' -d '{
  "indices": "hoge"
}'
```

●レストア

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/restore-snapshot-api.html

・例

```bash
curl -XPOST localhost:9200/_snapshot/hoge-repo/snapshot_20221126/_restore?wait_for_completion=true -H 'Content-Type: application/json'
```

## 確認

●リポジトリ

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-repositories.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/get-snapshot-repo-api.html

・例

CAT

```bash
curl localhost:9200/_cat/repositories #repository
curl localhost:9200/_cat/snapshots/hoge-repo #snapshot
```

GET

```bash
curl localhost:9200/_snapshot/hoge-repo #repository
curl localhost:9200/_snapshot/hoge-repo/snapshot_20221126 #snapshot
```

## 削除

・ドキュメント

https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-snapshot-repo-api.html
https://www.elastic.co/guide/en/elasticsearch/reference/current/delete-snapshot-api.html

・例

```bash
curl -XDELETE localhost:9200/_snapshot/hoge-repo #repository
curl -XDELETE localhost:9200/_snapshot/hoge-repo/snapshot_20221126 #snapshot
```

# health

CAT

```bash
curl localhost:9200/_cat/health
```

GET

```bash
curl localhost:9200/_cluster/health
```

※unassigned shardsの原因について

indexで問題が起きた際に以下のページの手順に従って、原因を調べることができます。

https://www.elastic.co/guide/en/cloud/current/ec-analyze_shards_with-api.html

# （余談）この記事のDocker環境の構築方法について

コマンドの実行結果を確認するため、Docker環境を構築しました。2022/11/26現在、Docker Composeはプラグイン化しており、インストール方法が変わっているためメモします。

https://docs.docker.jp/compose/index.html

サーバーはEC2（Amazon Linux2）とします。
以下のコマンドでDockerとDocker Composeプラグインをインストールします。


```bash
echo 'install docker'
DOCKER=docker-20.10.17-1.amzn2.0.1
sudo yum install -y ${DOCKER}
sudo systemctl start docker
sudo usermod -aG docker ec2-user

echo 'install docker compose plugin'
DOCKER_COMPOSE_VERSION="v2.13.0"
curl -o docker-compose -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-linux-x86_64
chmod +x docker-compose
sudo mv docker-compose /usr/libexec/docker/cli-plugins/
docker compose version
echo 'alias dk="docker compose"' >> ~/.bash_profile
```

Docker Composeのため、以下のyamlファイルでコンテナを定義しました。

```yaml:docker-compose.yaml
services:
  es:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.5.1
    ports:
    - "29201:9200"
    - "29301:9300"
    environment:
    - "discovery.type=single-node"
    - "xpack.security.enabled=false" #Elasticsearch v8からデフォルトでtrueになりました。
    - "path.repo=/es-backup"
    volumes:
    - es-backup:/es-backup

volumes:
  es-backup:
    driver_opts:
      type: none
      o: bind
      device: /es-backup
```

以下のコマンドでコンテナを起動します。

```bash
alias dk="docker compose" #コマンドが長いのでaliasで省略します。

dk up -d #Elasticsearchコンテナの起動
dk exec es bash #Elasticsearchコンテナにログイン
```

※参考
https://hub.docker.com/_/elasticsearch

# おわりに

今回は自分がよく使うコマンドをまとめました。打つコマンドが長いと指が痛くなったり、思い出すことに時間を取られたりしてしまうと思います。楽に作業する工夫を今後考えていきたいと思いました。