Elassticsearch試してみた

業務でElasticsearchに触ったので復習。

## 環境
Windows10

## ダウンロード
ElasticsearchとKibanaは事前に以下からダウンロードして解凍する。
https://www.elastic.co/jp/start
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/a2f492d9-307a-ca62-4b33-517d079ab875.png)

## 起動
それぞれ以下をダブルクリックで起動できる。

- Elasticsearch

`C:\~~\elasticsearch-7.10.0-windows-x86_64\elasticsearch-7.10.0\bin\elasticsearch.bat`

- Kibana

`C:\~~\kibana-7.10.0-windows-x86_64\bin\kibana.bat`

## 接続確認
以下URLで接続できれば、起動成功！

- Elasticsearch

http://localhost:9200/
⇒`cluster_name`とか`version`とか書いてるJSONが表示されるはず

- Kibana

http://localhost:5601/


## Kibanaで触ってみる
Kibanaの`Dev Tools`から作成してみる。
![スクリーンショット 2020-12-06 100020.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/4bcf5b15-45c8-0370-fee0-d9c2d19e683c.png)

↓こんな感じの画面で、左にqueryを記述して実行すると、右側にレスポンスが表示される。
query画面の一番右の`▷`で実行できる。(実行対象行を選択し、`ctrl` + `Enter`でも実行可能)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/f4a021c0-58e4-ba2e-560e-c4745da0dec3.png)

### index作成
インデックスはDBでいうデータベースのようなもの・・・？
`test_index`というインデックスを作成してみる。

```
PUT test_index
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/8e5bb4d1-bc41-c263-1922-0171b7449e53.png)

作成できたことを確認。

```
GET _cat/indices?v
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687030/c7e2c0e5-357f-e9e3-e41e-3d1a90650116.png)

#### 補足
`yellow open test_index                      lBZ1wx4vQyKcU8danKLkRQ 1 1  0    0    208b    208b`
`health`が`yellow `となっていますが、これはレプリカ（複製）が作成できていないため。
データが破損したとき等や負荷分散に使用されるレプリカは、デフォルトで1つ用意するように設定されている。
（レプリカは別ノードに作成する必要がある）
ローカル環境はデータノードは1台なので、レプリカを作成できないよーのyellowステータス。
そのままで問題ないが、どうしても`green`にしたい場合は、一度インデックスを削除してレプリカ1台でindexを再作成すればOK。

```
#インデックス削除
DELETE test_index

#レプリカ数0でインデックス再作成
PUT test_index
{
  "settings": {
    "number_of_replicas": 0
  }
}

#設定確認（test_index.settings.number_of_replicasが0になっていること）
GET test_index/_settings
```
### type作成
DBでいうテーブルのようなもの・・・？
↓でタイプを定義しようとしましたが、

```
POST test_index/test_type/
{
    "mappings" : {
        "qq" : {
            "properties" : {
                "id" : {
                  "type" : "integer"
                  },
                "name" : {
                  "type" : "string"
                }
            }
        }
    }
}
```

_#! Deprecation: [types removal] Specifying types in document index requests is deprecated, use the typeless endpoints instead (/{index}/_doc/{id}, /{index}/_doc, or /{index}/_create/{id}).

いつの間にか非推奨になっていたので、`test_index/_doc`で登録してみます。

```
POST test_index/_doc
{
  "test_id": 1,
  "test_name": "てすとねーむ"
}
```
登録できたので、`mapping`を確認。

```
GET test_index/_mapping
```

```
#GET test_index/_mapping 実行結果
{
  "test_index" : {
    "mappings" : {
      "properties" : {
        "test_id" : {
          "type" : "long"
        },
        "test_name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }
      }
    }
  }
}
```
先ほどのデータは以下のような定義で作成されていました。
（定義せずともデータ登録可能な点は変わっておらず、`type`という概念がなくなるっぽいですね。）

インデックスを作成するときに`mapping`（DBでいう`CREATE TABLE`?）を指定を指定するには以下でOK！のはず。。。

```
PUT test_index2
{
  "settings": {
    "number_of_replicas": 0               // レプリカ数指定
  },
  "mappings": {
    "properties": {
      "test_id": {　　　　　　　　　　　　　// test_id フィールド
        "type":"integer"
      },
      "test_name": {                      // test_nameフィールド
        "type": "keyword"　　　　　　　　 
      }
    }
  }
}
```

また、`mapping`は追加は可能ですが、削除・変更はできないです。

```
# NG
# 既存フィールド(test_id)のtypeをinteger→long
PUT test_index2/_mapping
{
  "properties": {
    "test_id": {
      "type": "long"
    }
  }
}

# OK
# new_field追加（元々あったフィールドは残る）
PUT test_index/_mapping
{
  "properties": {
    "new_field": {
      "type": "text"
    }
  }
}
```


## 所感
`Elasticsearch`を実際に業務で使ってたのは約1年半くらい前なので、記憶がうっすらしてて手探りでした。
色々変わっている点もあるので、公式ドキュメントもう一度さらっと読んでみます。
`Elasticsearch`は公式サイトにかなり詳しく説明が載っているのでおすすめです。
https://www.elastic.co/guide/jp/elasticsearch/reference/current/index.html