この記事は、「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を利用することが可能になります。
GCPは、デプロイされるまでの時間がめちゃくちゃ早いです。なのでもうソフトを起動する感覚でVMの作成・削除ができてしまいます。すごく贅沢な時代になったもんですね。。。もちろん起動するだけでも課金は発生するのでご注意ください。今回の内容だと、時間的には30円くらいで済んだ気がします。
デプロイが完了すると、下記画面になるので赤枠のボタンをクリックします。そうするとブラウザ上にターミナルが表示されてSSH接続ができます。
ついでにGCPの設定で、elasticsearchとkibanaで使用するポートも設定しといたほうがいいと思います。
ターミナルが起動したら、elasticsearchのインストールを確認するために、ステータスとバージョン情報を確認してみます。
/etc/init.d/elasticsearch status```
```sh
curl -X GET http://割り当たったIP:9200/```
[![try_004_06](../img/migration/2016/12/try_004_06-1024x414.png)](../img/migration/2016/12/try_004_06.png)
正常にインストールされていることが確認できました。
<br>
次に、実際にelasticsearchにジオなデータを登録してみます。elasticsearchでは、データをindex・type・documentといいます。データベースで言うとたぶん、db・table・recordですかね?今回はindexをsampledb、typeをsampletable、documentを1〜2としてみます。
また、elasticsearchにはジオなタイプとして「geo_point」と「geo_shape」というものがあります。
ジオ的な情報を扱う時は、事前にスキーマの定義が必要みたいなので今回はpointというフィールドに「geo_point」を定義してみます。
```bash
curl -XPUT 'http://割り当たったIP/sampledb/'
curl -XPUT 'http://割り当たったIP:9200/sampledb/sampletable/_mapping' -d '{
"sampletable" : {
"properties" : {
"point" : { "type" : "geo_point" }
}
}
}'
スキーマが定義されたようなのでデータを登録してみます。今回はポイントとして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
}
}'
基本的にエラー表示がでなければ登録されているはずです。一応検索して確認してみます。
curl -XPOST 'http://割り当たったIP:9200/sampledb/sampletable/_search'
全てを検索すると、登録した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
}
}
}
}
}
}'
検索結果に、登録したSapporo01のレコードのみ表示されました。検索エンジンで空間検索ができるのはすごいですね。
これだけでは物足りないので、可視化ツールのkibanaを使ってelasticsearchのデータを可視化してみようと思います。
まずは、kibanaをインストールをします。インストールするにはCarpe Diemというサイトが参考になりました。サイトの通り進めば正常にインストールできます。 ※バージョンは、「kibana-4.5.3」に置き換えてください。それ以下のバージョンだとタイル地図表示がうまくいきません。
kibanaのインストールが終わったら、正常に稼働しているか確認します。
/etc/init.d/kibana status
インストールが確認できたら次に、kibana.ymlを開いて設定を変更します。
ここでは、「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
それでは、実際にkibanaにアクセスしてみましょう。下記、URLにブラウザでアクセスします。kibanaの画面が表示されればOKです。
http://割り当たったIP:5601/
次に、kibanaにelasticsearchで作成したindexを登録します。今回はsampledbと記述します。
一応、kibanaのバージョンが4.5.3になっているかを確認します。
最後に、elasticsearchに登録したデータを可視化してみます。メニューからTilemapを選択します。
タイル画像が表示されているのが確認できます。この地図表示部分には、Leafletが利用されているため一般的なタイル画像を読み込むことが可能です。
次に、Geo Coordinatesを選択してpointフィールドを選択して実行します。すると、elasticsearchで登録した2レコードが地図上に可視化されました。
検索バーに、Sapporo01と入力すると指定した地点のみ絞り込み検索することも可能です。
elasticsearchとkibanaを組み合わせると、ジオなことに限らず色々なデータ分析が可能です。大量なデータを自動で登録してドカンと処理して可視化するとおもしろそうですね。今度はBeatsとLogstashも試してみたいです。 ※最新バージョンは5.1みたいなので情報少し古かったらごめんなさい。
- 参考文献 elastic elasticsearch Reference Kibana 4.5.3および4.1.10 リリースでタイルマップ表示修正 ElasticsearchTutorial.com Elasticsearch で位置情報を検索する手順 Elasticsearch2.1 × Kibana4.3 の導入