try_004_24

try_004_25


この記事は、「FOSS4G 二個目だよ Advent Calendar 2016」の17日目の記事です。


@dayjournal_nori elasticsearchのgeo queryでひとネタ
— Kosuke ASAHI (@waigania13) 2016年12月3日

弊社ボスからこんな指令がありました。

ということで、今回は全文検索エンジン「elasticsearch」と可視化ツール「kibana」を使ってジオ的なことを試してみました。

elasticsearch?kibana?ってかたはこちらを参照してみてください。なんだかおもしろそうですね。ドキュメントを調べていくと、実はelasticsearchでは地理空間情報を扱えます。しかもなんと、そのデータを可視化するkibanaの地図部分にはLeafletが利用されているようです。今回はelasticsearchとkibanaの導入から簡単な可視化のところまで試してみようと思います。

まず試すには、elasticsearchのインストールが必要です。インストールするためには、Javaの実行環境入れたり色々と大変そうなので今回はGCPでVMをデプロイしようと思います。

ありがたいことにGCPのCloud Launcherには、elasticsearchがインストール済VMが提供されています。VMをデプロイするだけですぐelasticsearchを利用することが可能になります。
try_004_01

try_004_02

GCPは、デプロイされるまでの時間がめちゃくちゃ早いです。なのでもうソフトを起動する感覚でVMの作成・削除ができてしまいます。すごく贅沢な時代になったもんですね。。。もちろん起動するだけでも課金は発生するのでご注意ください。今回の内容だと、時間的には30円くらいで済んだ気がします。


デプロイが完了すると、下記画面になるので赤枠のボタンをクリックします。そうするとブラウザ上にターミナルが表示されてSSH接続ができます。
try_004_03


ついでにGCPの設定で、elasticsearchとkibanaで使用するポートも設定しといたほうがいいと思います。
try_004_05


ターミナルが起動したら、elasticsearchのインストールを確認するために、ステータスとバージョン情報を確認してみます。


/etc/init.d/elasticsearch status

curl -X GET http://割り当たったIP:9200/

try_004_06

正常にインストールされていることが確認できました。


次に、実際にelasticsearchにジオなデータを登録してみます。elasticsearchでは、データをindex・type・documentといいます。データベースで言うとたぶん、db・table・recordですかね?今回はindexをsampledb、typeをsampletable、documentを1〜2としてみます。

また、elasticsearchにはジオなタイプとして「geo_point」と「geo_shape」というものがあります。
ジオ的な情報を扱う時は、事前にスキーマの定義が必要みたいなので今回はpointというフィールドに「geo_point」を定義してみます。


curl -XPUT 'http://割り当たったIP/sampledb/'

curl -XPUT 'http://割り当たったIP:9200/sampledb/sampletable/_mapping' -d '{
"sampletable" : {
"properties" : {
"point" : { "type" : "geo_point" }
}
}
}'

try_004_07


スキーマが定義されたようなのでデータを登録してみます。今回はポイントとして2レコード登録してみます。


curl -XPUT 'http://割り当たったIP:9200/sampledb/sampletable/1' -d '{
"name" : "Sapporo01",
"point" : {
"lat" : 43.06847,
"lon" : 141.35098
}
}'

curl -XPUT 'http://割り当たったIP:9200/sampledb/sampletable/2' -d '{
"name" : "Sapporo02",
"point" : {
"lat" : 43.05624,
"lon" : 141.38584
}
}'

try_004_08


基本的にエラー表示がでなければ登録されているはずです。一応検索して確認してみます。


curl -XPOST 'http://割り当たったIP:9200/sampledb/sampletable/_search'

try_004_09

全てを検索すると、登録した2レコードが表示されました。


次に、空間検索を試してみようと思います。elasticsearchはジオなデータの登録だけではなく、空間検索にも対応しています。今回は、指定したポイントの中心から1km範囲内にあるレコードを検索してみます。範囲を検索したい時は、「geo_distance」を利用します。


curl -XPOST 'http://割り当たったIP:9200/sampledb/sampletable/_search' -d '{
"query": {
"filtered" : {
"query" : {
"match_all" : {}
},
"filter" : {
"geo_distance" : {
"distance" : "1km",
"point" : {
"lat" : 43.06801,
"lon" : 141.34968
}
}
}
}
}
}'

try_004_10

検索結果に、登録したSapporo01のレコードのみ表示されました。検索エンジンで空間検索ができるのはすごいですね。


これだけでは物足りないので、可視化ツールのkibanaを使ってelasticsearchのデータを可視化してみようと思います。

まずは、kibanaをインストールをします。インストールするにはCarpe Diemというサイトが参考になりました。サイトの通り進めば正常にインストールできます。
※バージョンは、「kibana-4.5.3」に置き換えてください。それ以下のバージョンだとタイル地図表示がうまくいきません。

try_004_11

try_004_12

kibanaのインストールが終わったら、正常に稼働しているか確認します。


/etc/init.d/kibana status


インストールが確認できたら次に、kibana.ymlを開いて設定を変更します。
try_004_13


ここでは、「elasticsearchの接続先」と「タイルURLの指定」を設定します。


elasticsearch.url: "http://割り当たったIP:9200"

tilemap.url: 'https://tile.mierune.co.jp/mierune_mono/{z}/{x}/{y}.png'
tilemap.options.attribution: 'Maptiles by <a href="http://mierune.co.jp/" target="_blank">MIERUNE</a>, under CC BY. Data by <a href="http://osm.org/copyright" target="_blank">OpenStreetMap</a> contributors, under ODbL.'
tilemap.options.maxZoom: 18

[![try_004_14](../img/migration/2016/12/try_004_14-1024x577.png)](../img/migration/2016/12/try_004_14.png)


kibana.ymlを保存したら、kibanaを再起動します。


/etc/init.d/kibana restart

try_004_15


それでは、実際にkibanaにアクセスしてみましょう。下記、URLにブラウザでアクセスします。kibanaの画面が表示されればOKです。


http://割り当たったIP:5601/

try_004_16


次に、kibanaにelasticsearchで作成したindexを登録します。今回はsampledbと記述します。
try_004_17


一応、kibanaのバージョンが4.5.3になっているかを確認します。
try_004_18


最後に、elasticsearchに登録したデータを可視化してみます。メニューからTilemapを選択します。
try_004_19


新規作成を選択します。
try_004_20


タイル画像が表示されているのが確認できます。この地図表示部分には、Leafletが利用されているため一般的なタイル画像を読み込むことが可能です。
try_004_21


次に、Geo Coordinatesを選択してpointフィールドを選択して実行します。すると、elasticsearchで登録した2レコードが地図上に可視化されました。
try_004_22


検索バーに、Sapporo01と入力すると指定した地点のみ絞り込み検索することも可能です。
try_004_23


elasticsearchとkibanaを組み合わせると、ジオなことに限らず色々なデータ分析が可能です。大量なデータを自動で登録してドカンと処理して可視化するとおもしろそうですね。今度はBeatsとLogstashも試してみたいです。
※最新バージョンは5.1みたいなので情報少し古かったらごめんなさい。







Q&A