Elasticsearch の index template を作成して適用するまで

# 背景
j-yamaさんの記事を大いに参考にさせていただき、ELKの勉強をしていたところ、index template まわりでつまづいたので、メモ

https://qiita.com/j-yama/items/e155f848f93e01c28d1d

# 環境
j-yamaさん配布の docker-compose をそのまま使いました。

https://github.com/j-yama/logstash-http-poller-input-plugin-example

３コマンドで環境構築完了なので、j-yamaさんと git と docker には感謝しかありません。

実行したコマンド↓

```
git clone https://github.com/j-yama/logstash-http-poller-input-plugin-example
cd logstash-http-poller-input-plugin-example
docker-compose up -d
```

#本題
さて、本題の index template の作成方法および適用方法についてです。

## index template でやりたいこと
インデックスのとあるフィールドのデータ型を定義したい。

今回定義したい内容：
- 対象インデックス： nasa-yyyy.mm.dd
- 対象フィールド： events.geometries.coordinates
- 指定するデータ型： geo_point（位置情報を表す）

index template を使わずにインデックスを作成したところ、number という数値データとして認識されてしまったため、明示的にデータ型を指定しておく必要がある。

このように、index template を使うと、Elasticsearch に作成されるインデックスをあらかじめ定義しておくことができる。（と認識している）

## 手順
- index template 適用前の状態確認
- index template の作成
- index の再作成
- index_pattern の再作成
- index template 適用後の状態確認

> 前提：上記の環境で正常に Logstash、Elasticsearch、Kibana が動作していること

## index template 適用前の状態確認
index template を作成せずに、index および index pattern を作成した場合

![スクリーンショット 2021-04-13 22.58.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/960ce302-dddc-ff15-e268-423e0d6b7c39.png)

events.geometries.coordinates の Type が "number" になっている。
このままだと、位置情報として扱えない。

## index template の作成
kibana 上で下記のように選択していく
Management -> Index Management -> Index Templates -> Create a Template
![スクリーンショット 2021-04-13 23.24.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/ff9079e6-b2fe-ba27-1ad6-a20bc994f556.png)

ウィザードが表示されるので、Name と Index patterns を指定 -> Next
Name: 適当に
Index pattern: テンプレートを適用したいインデックスがマッチするように
![スクリーンショット 2021-04-13 23.30.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/a44b6096-97ec-662c-79a2-2dc28e729f34.png)

Index settings は何も指定せず -> Next
Mappingsを下記のように設定 -> Next
> 書き方がわからなかったので、すでにあった index template や、既存の index の mapping 設定を見て書きました
どうやらデータが階層化されていた場合、毎回 "properties" と書いて下の階層を定義するようです

```
{
  "properties": {
    "events": {
      "properties": {
        "geometries": {
          "properties": {
            "coordinates": {
              "type": "geo_point"
            }
          }
        }
      }
    }
  }
}
```
Aliases は何も指定せずNext
最後に Create template をクリック

以上で index template が作成されました。

## index の再作成
さて、ここで落とし穴の紹介です。
テンプレートを適用したいインデックスがすでに存在していた場合、**インデックスの再作成が必要**なようです。
> まだインデックスを作成していなければ特に気にせずインデックスを作成するだけです。

Index Management -> インデックスを選択 -> Manage -> Delete Index で削除します。

![スクリーンショット 2021-04-13 23.55.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/115c1a52-e74c-de7b-c8b7-0e84a97fe2fd.png)



私はここでしばらくつまづきました。
「index pattern を再作成すればいいんでしょ」と意気込んで index pattern を作成し直すも、Type が Number のままという状態がつづきました。

もしやと思いインデックスを一度削除し、作成しなおしたところうまくいきました。

## index pattern の再作成
index pattern も同様に、すでに存在していた場合は作成し直します。

まずは既存の index pattern を削除
Index Pattern -> 削除する index pattern を選択 -> ゴミ箱ボタン

![スクリーンショット 2021-04-14 0.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/0231a895-318f-c43b-dc1d-3e5a2fe853c7.png)

改めて index pattern を作成
Index Pattern -> Create index pattern
Index pattern に nasa* と入力 -> Next step
Time Filter field name に `@timestamp` を指定 -> Create index pattern

![スクリーンショット 2021-04-14 0.15.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/c08ed6a2-664a-2a8f-1b8d-b0486135e6f2.png)

![スクリーンショット 2021-04-14 0.21.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/fe1da31f-f1ef-d20f-9f8e-02611f8cc5ff.png)

![スクリーンショット 2021-04-14 0.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/f0b0e342-fbbe-f2a9-2983-8bf711fd9897.png)

## index template適用後の状態確認
上記の手順で index pattern を作成すると、作成された index pattern の各フィールド情報が表示される。
events.geometries.coordinates のデータ型（Type）が `geo_point` になっていることを確認する。

![スクリーンショット 2021-04-14 0.23.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1035995/26b00a7a-3c54-bc6b-d3ce-9d0490117294.png)

# まとめ
j-yamaさん、ありがとうございました。