【Elasticsearch入門】速習Elasticsearch CRUD編

# ゴール
本記事ではElasticsearchの以下の基本操作の中のCRUDを簡単に紹介します

- CRUD
- Search
    - query
    - aggregation

# Elasticsearch
Elasticsearch は オープンソースの全文検索エンジンです。
Apache LuceneをベースとしたJavaで書かれたソフトウェアでElastic社により開発が進められています。
登録したドキュメントから目的の単語を含むドキュメントを高速に検索することができます。
基本的にElasticsearchではRestful APIを使って操作します。

# バージョン等
Elasticsearch: 7.6.2
kibana: 7.6.2
※ 簡単にCRUD操作を行うためにKibanaのDevToolsを使用します。

# 環境準備
環境に関しては以下の投稿に記載の通りで用意しています。
[【Elasticsearch入門】環境構築](https://qiita.com/doiken_/items/fbbaf835710a1827e2f1)
[【Elasticsearch入門】環境構築 Windows編](https://qiita.com/doiken_/items/7847f8fd2bd65ceeaf18)

# 早速触ります
## CRUD
ドキュメントの作成、取得、更新、削除について紹介します。
### Create

#### 1. IDを指定してドキュメントを作成する

```
PUT /{index}/_doc/{Document ID} 
{
  "key1": "value1",
  "key2": {
    "key2-1": "value2-1",
    "key2-2": "value2-2",
  }
}
```
**例**
リクエスト

```
PUT my_index/_doc/1
{
  "name": "elasticsearch",
  "message": "hello world",
  "price": 100
}
```

レスポンス

```
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}
```
レスポンスの結果より、`"_id" : "1"`のドキュメントが作成されたことがわかります。
このようにIDを指定してドキュメントを作成したい場合にPUTを使用します。

#### 2. IDを指定してせずにドキュメントを作成する

```
POST /{index}/_doc
{
  "key1": "value1",
  "key2": {
    "key2-1": "value2-1",
    "key2-2": "value2-2",
  }
}
```
**例**
リクエスト

```
POST my_index/_doc
{
  "name": "kibana",
  "message": "hello world",
  "price": 100
}
```

レスポンス

```
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "oJ3HcXMBFnhBnJdYQvy1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}
```

レスポンスの結果より、`"_id" : "oJ3HcXMBFnhBnJdYQvy1"`のドキュメントが作成されたことがわかります。
このようにIDを指定せずにドキュメントを作成したい場合にPOSTを使用して自動的にIDが付与されるようにリクエストを投げることができます。

### Read
IDを指定してドキュメントを取得する

```
GET /{index}/_doc/{Document ID}
```
**例**
リクエスト

```
GET my_index/_doc/1
```

レスポンス

```
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 1,
  "_seq_no" : 0,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "elasticsearch",
    "message" : "hello world",
    "price" : 100
  }
}
```

レスポンスの結果より、`"_id" : "1"`のドキュメントが取得されたことがわかります。
また、`"_source"`の中身をみることで実際のドキュメントの中身をみることもできます。

### Update

#### 1. ドキュメントの更新

```
PUT /{index}/_doc/{Document ID} 
{
  "key1": "value1",
  "key2": {
    "key2-1": "value2-1",
    "key2-2": "value2-2",
  }
}
```
**例**
リクエスト

```
PUT my_index/_doc/1
{
  "name": "elasticsearch2",
  "message": "hello world2",
  "price": 200
}
```

レスポンス

```
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}
```
レスポンスの結果をみると`"_version" : 2`の表記により、`"_id" : "1"`のドキュメントが更新されたことがわかります。
また、`GET my_index/_doc/1`により実際のドキュメントを確認できます。

```
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 2,
  "_seq_no" : 1,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "elasticsearch2",
    "message" : "hello world2",
    "price" : 200
  }
}
```


#### 2. ドキュメントを部分的に更新する
PUTを用いることでドキュメントそのものを更新することができますが、特定のフィールドを部分的に更新することもできます。

```
POST /{index}/_update/{Document ID} 
{
  "doc": {
    "key1": "value1",
    "key2": {
      "key2-1": "value2-1",
      "key2-2": "value2-2",
    }
  }
}
```
**例**
リクエスト

```
POST my_index/_update/1
{
  "doc": {
     "price": 500
  }
}
```

レスポンス

```
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "result" : "updated",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 2,
  "_primary_term" : 1
}
```
レスポンスの結果をみると`"_version" : 3`の表記により、`"_id" : "1"`のドキュメントが更新されたことがわかります。
また、`GET my_index/_doc/1`により実際のドキュメントを確認できます。

```
{
  "_index" : "my_index",
  "_type" : "_doc",
  "_id" : "1",
  "_version" : 3,
  "_seq_no" : 2,
  "_primary_term" : 1,
  "found" : true,
  "_source" : {
    "name" : "elasticsearch2",
    "message" : "hello world2",
    "price" : 500
  }
}
```
`"price" : 500`のみが更新されたことがわかるかと思います。

### Delete
以下のリクエストで削除を行うことができます。

```
DELETE {index}
```

**例**
リクエスト

```
DELETE my_index
```

レスポンス

```
{
  "acknowledged" : true
}
```

# おすすめ教材


- [はじめてのElasticsearch](https://www.udemy.com/course/elasticsearch/?couponCode=3BE4592DF570D6DA69CF)
- [はじめてのKibana](https://www.udemy.com/course/kibana-jap/?couponCode=E59890B71A886D5A1CED)