ELK(Elasticsearch)7系にてCSVからCoordinate Mapを作る

#【経緯】
ELKでオープンデータを可視化するサイトを作成しております。
マップ上にデータをグラフ表示したく、KibanaのCoordinate Mapを使おうと思ったのですが、予想外に苦戦しました。
備忘を兼ねて投稿します。
ちなみにMapイメージはこんな感じです。
![map.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/73533ab5-9970-9993-cf0f-2debc54f1f78.png)


#【Kibanaのマップについて】
Kibanaではマップが２種類あります。
・Region Map：指定した地区の領域を色付けして表示する。
・Coodinate Map：指定した緯度経度のポイントにメトリクスを表示する。

Redion Mapについては以下のサイトが参考になります。
　<a href="https://dev.classmethod.jp/server-side/elasticsearch/kibana-5-5-0-region-map/">Kibana 5.5.0 の新機能の Region Map を試してみた</a>
　<a href="https://dev.classmethod.jp/server-side/elasticsearch/kibana-region-map-custom-geojson/">Region Map で都道府県のデータを描画してみた</a>

本投稿では、Coodinate Mapを扱いたいと思います。

#【環境】
*OS：Amazon Linux 2
データベース：Elasticsearch 7.1
データ投入：Logstash 7.1
データ可視化：Kibana 7.1*

**※注意：本投稿はELK7系での手順です。他バージョンではおそらく違う設定・手順になるかと思うのでご留意ください。**


#【作業手順】
## 全体の作業の流れ
1. CSVファイルを用意する
2. Logstashのconfファイルを作成する
3. index templateを設定する
4. logstashによりcsvデータを取り込み
5. kibanaでCoordinate Mapを作成する

それでは具体的な手順を以下に示します。

## 1. CSVファイルを用意する
まずはCSVファイルを用意します。


```csv:sample.csv
id,nengetsu,chiku,gyorui,kairui,sonota,sourui,sousuu,kingaku,lat,lon  #←この行は削除すること
ID,年月,市町村名,魚類,貝類,その他,藻類,総数,漁獲金額,緯度,経度　#←この行は削除すること
1,2018-01-01,深浦町,220201,278,87827,930,309236,199231,40.650993,139.929676
2,2018-01-01,鰺ヶ沢町,82891,16,64543,27,147477,80995,40.778099,140.220862
3,2018-01-01,つがる市,2185,0,688,0,2873,1690,40.882709,140.2922
（以下省略）
```
先頭の2行は説明のために表記しております。実際のCSVでは先頭２行は削除してください。

## 2. Logstashのconfファイルを作成する
LogstashでCSVデータを取り込むために、以下のようなconfファイルを用意します。

```conf:sample.conf
input {
    file {
        path => ["/etc/logstash/conf.d/sample.csv"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
    }
}

filter {
    csv {
        columns => ["id","nengetsu","chiku","gyorui","kairui","sonota","sourui","sousuu","kingaku","latitude","longitude"]
    }
    date {
        match => ["nengetsu", "yyyy-MM-dd"]
    }
    mutate {
      convert => {
        "id" => integer
        "chiku" => string
        "gyorui" => integer
        "kairui" => integer
        "sonota" => integer
        "sourui" => integer
        "sousuu" => integer
        "kingaku" => integer
        "latitude" => "float"
        "longitude" => "float"
      }
      
      add_field => {
          "[location][lat]" => "%{latitude}"
          "[location][lon]" => "%{longitude}"
      }
      convert => {
            "[location][lat]" => "float"
            "[location][lon]" => "float"
      }
    }
}

output {
    elasticsearch {
        index => "sample"
        document_id => "%{id}"
    }
}
```

## 3. index templateを設定する
csvとconfが用意できたところでデータ投入、と行きたいところですが、投入の前にElasticsearchにてindex templateの設定が必要です。

```
# curl -H 'Content-Type: application/json' -XPUT 'http://localhost:9200/_template/sample' -d '
{
  "index_patterns": "sample*",
  "mappings": {"properties": {"location": {"type": "geo_point"}}}
}'
```
上記コマンドを実行し、「{"acknowledged":true}」と表示されればＯＫです。

## 4. logstashによりcsvデータを取り込み
それではいよいよデータを投入します。
まずはsample.csvとsample.confを/etc/logstash/conf.d/に配備してください。

```
# pwd
/etc/logstash/conf.d
# ls
sample.conf  sample.csv
```

そして以下のコマンドで実行です。少々時間がかかるかもしれません。

```
# /usr/share/logstash/bin/logstash -f ./sample.conf
```

数分程度時間がかかるかもしれません。
[ERROR]が出ずに[Successfully started Logstash API endpoint]というメッセージが出ればOKです。
（[WARN]は気にしなくて大丈夫です。）

## 5. KibanaでCoordinate Mapを作成する
最後にKibanaでマップを作ります。
<hr>
①まず初めに[Management]の[index Patterns]でindex patarnを作成します。

名前は「sample*」とします。
Time Fileterは[@timestamp]を選択します。

![index1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/8fce8fba-7458-2438-9f0b-81d1c4b80ead.png)
![index2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/eddc3b16-4bac-4ad0-c698-330c611546da.png)
<hr>
②次に[Visualise]の新規作成で[Coordinate Map]を選択し、「sample*」を選択します。
![visual1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/8ff3231e-ac33-047d-cfa2-fd054d33ace5.png)
![visual2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/989750ae-6cc8-a103-38bc-14ec07152a61.png)
<hr>
③[Metrics]と[Buckets]を設定します。
また右上の対象期間を適切に設定してください。（デフォルトのままだと何も表示されないことがあります。）
設定を終えたら三角形の実行アイコンをクリックすると、MAP上に表示されます。
![visual3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/bcf194c9-4630-1fca-3fa4-79d1f4fc091e.png)
![visual4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/0585afe2-9dba-8d00-58a2-72b1f3ebd5ff.png)
<hr>
④MAP左上の真ん中のアイコンをクリックすると、ちょうどいい感じでズームしてくれます。

![visual5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35814/8e0f3c7c-0017-f79a-b298-20ea32b9ebee.png)

なんかいい感じに表示されました！

# 【最後に】
ポイントはlogstashで取り込む前にtemplateを設定しておくことですね。これが分からなくて苦戦しました。
（logstashのconfでgeo_point型を設定できないかといろいろチャレンジしてましたが、結局はtemplateで解決しました。）

ElasticとKibanaを使って作成したグラフを以下サイトで公開しております。
興味がございましたら見てみてください。

<a href="http://aomori.fromblue.jp">青森の統計データを見てみよう</a>
<br>