Elasticsearch(7.9.1)にCLIとKibanaからデータ投入

![512px-Elasticsearch_logo.svg (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/8d531869-9e7c-70cb-eb8f-bb95718ce197.png)

# はじめに

この記事では<a href="https://qiita.com/hayapo/items/727efcde5858c86c02cc"target="_blank">前回の記事</a>の続きとして、ElasticsearchにKibana Dev-ToolsとBashの2つの方法でMappingとデータ投入を行う方法を解説していきます。

## 参考

 - <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html"target="_blank">Mapping</a>
 - <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#structured-data-types"target="_blank">Field data types</a>
 - <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.0/removal-of-types.html#_custom_type_field"target="_blank">Removal of mapping types</a>
- <a href="https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329"target="_blank">はじめての Elasticsearch</a>
- <a href="https://qiita.com/mkisono/items/4bcaedeced3b70312976"target="_blank">Elasticsearchからtypeが無くなる</a>
- <a href="https://dev.classmethod.jp/articles/elasticsearch-6-breaking-changes/#toc-9"target="_blank">Elasticsearch 6 を利用する前に把握しておいた方がよさそうなこと</a>

# なぜこの記事を書いたのか

バイトでElasticsearchを扱う際にMappingや検索などの方法をググっても全然最新の記事が出てこず、世界に絶望しました
![pose_zasetsu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/6e60bb96-9375-d3d9-ee51-a3a17d4fef8f.png)
最新の情報が日本語として落ちてくるのは時間がかかる.....
そこで現在最新のElasticsearch7.9.1の操作を僕の知識の範囲で記事にして、少しでもElasticsearchを始める人の手助けになるべく記事を書いていこうと思います


# 1. 概要

今回はDev-ToolsとBashの両方からElasticsearchにMappingを行う方法をまとめていますが、ほとんどクエリの内容に違いはありません
個人的には、Dev-Toolsはいちいちブラウザを立ち上げなくちゃいけないのでBashから操作するほうが楽で好きです。

# 2. 環境

- Ubuntu 20.04
- Elasticsearch 7.9.1
- Kibana 7.9.1

# 3. Elasticsearch6.0,7.0以降の注意点

ElasticSearch6.0以降(この記事で扱っている7.9.1も同様)は、クエリやMappingに一部の大きな変更があります
その中でMappingに関係がある点を取り上げます

#### ① Content-Typeヘッダの指定

ElasticSearch5.xまではこのContent-Typeを指定しなくても良かったのですが、6.x以降よりこの指定が必須となりました

```bash
curl -H "Content-Type: application/json" -XPUT "http//127.0.0.1:9200/my_index?pretty"
```

#### ② Type指定はしなくていい

Elasticsearch7.0からタイプレスAPIへと移行し、Mapping時にタイプの指定が必要なくなりました
この詳しい理由は<a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.0/removal-of-types.html#_custom_type_field"target="_blank">この記事</a>を参考ください
要約すると、一つのインデックスに共通要素の少ないtypeが混在していると、Elasticsearc内部でLucenceのドキュメント圧縮が効率良く行えないから

```
#~7.0
{
  "mappings": {
    "user" : { #<-7.0まではここにTypeを入れられた
      "properties": {
        "username": {
          "type": "keyword"
        }
      }
    }
  }
}
```
```
#7.0~
{
  "mappings": {
    "properties": {
      "username": {
        "type": "keyword"
      }
    }
  }
}
```

#### ③ Field TypeにStringが使えなくなった

Elastisearch6.0では文字列フィールドにStringが使用できなくなり、代わりにtextかkeywordを使うように変更された

# 4. Fieldのデータ型

次に、Mappingの前にElasticsearchで使用できるFieldのデータ型を紹介します
これらが全てではないです。<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html#structured-data-types"target="_blank">公式ドキュメント</a>に全部載っています。

#### 典型的なデータ型

|型|  |
| ---- | ---- |
| keyword | 名前やIDなどの単語 |
| long | 64bitの符号付き整数 |
| double | 倍精度64bit IEEE754<br>浮動小数点数 |
| boolean | ブール値。trueかfalseの2値 |
| date |yyyy-MM-dd(これ以外の形式も使える) |

#### 構造化データ型

|型|  |
| ---- | ---- |
| long_range,date_range,<br>ip_range | 数値や日付、IPアドレスの範囲 |
| ip | IPv4かIPv6のIPアドレス |

#### テキスト検索のデータ型

|型|  |
| ---- | ---- |
| text | Analyzedされた非構造化テキスト<br>全文検索で使う |

#### 特殊なデータ型

|型|  |
| ---- | ---- |
| histogram | 度数と階級で扱う。詳しくは<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/histogram.html"target="_blank">ここ</a> |
| geo_point | 緯度と経度のペアで扱う。地理的な特徴や中心地からの距離で集計される | 

# 5. CLIからのMapping~データ投入

さて、前置きが長くなりましたがいよいよMappingについて説明していきます

#### ① Indexの作成

```bash

curl -H "Content-Type: application/json" -X PUT "http://127.0.0.1:9200/test_index1?pretty" -d '
     {
       "mappings" : {
         "properties" : {
           "hoge" : {"type" : "text"},
           "huga" : {"type" : "long"},
           "time" : {"type" : "date"}
         }
       }
     }'
```

##### 作成結果

```bash
$  curl -H "Content-Type: application/json" -X GET "http://127.0.0.1:9200/test_index1?pretty"
{
  "test_index1" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "hoge" : {
          "type" : "text"
        },
        "huga" : {
          "type" : "long"
        },
        "time" : {
          "type" : "date"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1600221292751",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "GHl3ZSAlTSu5ayA_8MHPcg",
        "version" : {
          "created" : "7090199"
        },
        "provided_name" : "test_index1"
      }
    }
  }
}
```

#### ② データ登録

データを投入します
投入は以下のようにやります

```bash

$ curl -H "Content-Type: application/json" -XPOST 'http://127.0.0.1:9200/test_index2/_doc/data1?pretty' -d '
     {
       "hoge" : "hogehoge",
       "huga" : "2020",
       "time" : "2020-09-16"
     }'
$ curl -H "Content-Type: application/json" -XPOST 'http://127.0.0.1:9200/test_index2/_doc/data2?pretty' -d '
     {
       "hoge" : "hogehuga",
       "huga" : 2021,
       "time" : "2021-09-16"
     }'
```

##### 投入結果

```bash
$ curl -H "Content-Type: application/json" -X GET "http://127.0.0.1:9200/test_index2/_search?pretty"
{
  "took" : 712,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_index2",
        "_type" : "_doc",
        "_id" : "data1",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehoge",
          "huga" : 2020,
          "time" : "2020-09-16"
        }
      },
      {
        "_index" : "test_index2",
        "_type" : "_doc",
        "_id" : "data2",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehuga",
          "huga" : 2021,
          "time" : "2021-09-16"
        }
      }
    ]
  }

```
ちゃんとデータ投入されてるのが確認できますね

つぎはKibanaからMapping~データ投入の手順を紹介していきたいと思います

# 6. KibanaからMapping~データ投入
ほとんど変わりませんが、クエリはbashより簡単になってます

#### ① Mapping

```
PUT test_kibana
 {
   "mappings" : {
     "properties" : {
       "hoge" : {"type" : "text"},
       "huga" : {"type" : "long"},
       "time" : {"type" : "date"}
     }
   }
 }'

```

##### Mapping結果

```
{
  "acknowledged" : true,
  "shards_acknowledged" : true,
  "index" : "test_kibana"
}
```

Dev-Toolsのコンソールはこんな感じ
![コメント 2020-09-16 123338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/7a72a0f6-e724-056c-566f-a2f72161b3ca.png)
![コメント 2020-09-16 1223338.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/b5cd2c5a-a2b9-81fd-ce68-cae2766d9392.png)


#### ② データ投入

```
PUT test_kibana/_doc/data1
 {
    "hoge" : "hogehoge",
    "huga" : 2020,
    "time" : "2020-09-16"
 }
PUT test_kibana/_doc/data2
 {
    "hoge" : "hogehuga",
    "huga" : 2021,
    "time" : "2022-09-16"
 }
```

```
# PUT test_kibana/_doc/data1
{
  "_index" : "test_kibana",
  "_type" : "_doc",
  "_id" : "data1",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 0,
  "_primary_term" : 1
}

# PUT test_kibana/_doc/data2
{
  "_index" : "test_kibana",
  "_type" : "_doc",
  "_id" : "data2",
  "_version" : 1,
  "result" : "created",
  "_shards" : {
    "total" : 2,
    "successful" : 1,
    "failed" : 0
  },
  "_seq_no" : 1,
  "_primary_term" : 1
}
```

コンソール画面
![コメント 2020-09-16 123738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/190c7e58-f764-e956-46c6-af1606367165.png)
![コメント 2020-09-16 1223738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/a82919dd-5bb7-f081-7ecb-a6537d3d93a0.png)

#### ③ 投入結果

データ投入の結果を確認する

##### コマンド

```
GET test_kibana/_search
```

##### 実行結果

```
{
  "took" : 192,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "test_kibana",
        "_type" : "_doc",
        "_id" : "data1",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehoge",
          "huga" : 2020,
          "time" : "2020-09-16"
        }
      },
      {
        "_index" : "test_kibana",
        "_type" : "_doc",
        "_id" : "data2",
        "_score" : 1.0,
        "_source" : {
          "hoge" : "hogehuga",
          "huga" : 2021,
          "time" : "2022-09-16"
        }
      }
    ]
  }
}
```

コンソール画面
![コメント 2020-09-16 12232738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/9c249959-bef5-dfe5-fb40-b2b51c560967.png)
![コメント 2020-09-16 1223233738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439660/31ba0965-6cb1-df6c-fb7d-9fd1409eda4f.png)
問題なく2つのデータが投入されているのが確認できる

# 7. まとめ
ここまでBashとDev-ToolsでのElasticsearchのMappingとデータ投入を解説しました
以外に簡単ですね:flushed:
bash派だった僕も、この記事を書いている過程でDev-Toolsの素晴らしさに惹かれてしまいました....
Dev-Toolsが使える環境なら積極的に使ってみるのもいいかもしれないですね

次回はPythonでElasticsearchにMappingやデータ投入するのを記事にしようかなと思います