Loading...
ElasticsearchIT

elasticsearchで始めるおうちロガー:インデックスの作成とデータの投入の基本

こんにちはszkです。

だいぶ前に書いた「おうちロガーで学ぶ統合ログ管理ソフトElasticsearch [Elasticsearchのインストール]【v7.3.0版】」ですが、そろそろデータの投入記事も書かないとなぁと思ったので記載します。
見よう見まねでszkがやってみた軌跡の記事なので、手順としては無駄なものが多いです。
とりあえず結果が欲しい方は次回の記事までお待ちください・・・

elasticsearchのデータについて

他所で詳しく書いてあるので詳細までは省きますが、elasticsearch(以下ES)のデータ構造はレコードで管理するRDSとは異なり、ドキュメントという文書体系で管理されます。
そしてドキュメントの集合体を「インデックス(Index)」と呼び、インデックスがどのような文書のフォーマットで成り立つのかを定義する「インデックステンプレート(index template)」が存在します。

今回はelasticsearchのAPIを用いてCurlからインデックスの作成、投入を行うところまでを行っていきます。

今回作るもの

今回作成する目標物としては家の湿度と温度、明るさを測定してくれるNatureRemoのAPIをロギングしていこうと思います。

必要なもの

・elasticsearch cluster(オールインワンの場合はそれでもOK)
・NatureRemo
・NatureRemoのAPIを叩いてElasticsearchAPIに投入するためのLinuxマシン(ESが乗っている機器でも可能)

また、前提としてこの手順でElasticsearchClusterがすでに動作済みであることとします。

まずデータを入力してみる

細かい文書体系などは、リファレンスガイドやほかの詳しく記載されているブログを参照してください。
まず、Curlを使ってESにデータを投入します。

Curlが打てるノードからESにデータを投入する

「温度」「湿度」「明るさ」のデータ構造を持ったインデックスを作ってみます。
Index名はtest_indexとします。

curl -H "Content-Type: application/json" -X POST "http://127.0.0.1:9200/test_index/_doc " -d '{
   "hum": '27.1',
   "ill": '30',
   "tmp"  : '25.5'
    }'

※まだ数値も手入力の状態です

APIをCurl経由でたたく場合はこのように記載することでESにIndex投入が可能です。
APIからのレスポンスは成功しているこ次のような表記が返ってきます。

{"_index":"test_index","_type":"_doc","_id":"b9wiw2wB_-vP0srr58zP","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":0,"_primary_term":1}

では、実際にデータが閲覧できるかKibanaで見てみましょう。

投入したデータの確認

KibanaノードにWebブラウザからアクセスし「Management」→「Index mmanagement」を選択。

ちなみに場所はここ、Webブラウザからのアクセスとなる。

登録したIndexがあればIndexの作成は成功しています。

続いて中身のデータの閲覧です。
中身を検索するためにはIndexPatternの作成が必要です。

IndexPatternはESで検索するときの「検索対象のグルーピング」です。
ESのエンジンとなるLucene本来の設計思想的ではIndexをまたいで検索は行えません。
ESではこのIndexPatternを設定しておくと複数のIndexを1つのまとまりとして検索することが可能となります。

IndexPatternを作成する

InexPaternを作成するにはKibanaにて「Management」→「IndexPattern」を選択します。


場所はこちら

その後「Create Index Pattern」を選択。

上記のオペレーションができたらIndexPatternを設定します。
例えば今回は「test_index」なので「test_index*」と入力しておけば将来的に「test_index_201908」といった名称がついたIndexをまとめて検索できるようになります。
ちなみに*を先頭につければ「*test_index」といった名前もパターン化できます。

①に入力すると②に該当するIndexが自動で出てくる。


作成完了するとこのような画面が出てくる。Curlで投入したフィールド「hum」「ill」「tmp」が存在していることがわかる。

作成できたらデータを検索してみましょう。

データの検索

データの検索はKibanaのメニューから「Discover」を選択します。


この「コンパス」のアイコンがDiscover画面の入り口

選択したらデータを検索してみましょう。
温度に値が入っているデータを検索してみます。

まずは先ほど作成したIndex Patternを選択する必要があります。
画面右上のIndex Patternから先ほど作成した「test_index」を選択します。


過去に作ったIndexがある場合はここにまとめて表示される。

そして画面上部の「Filters」に値を入力します。
今回はtmpに値が入っているものを検索しましょう。

tmp:*

結果

1hitしました!

そういえば、このデータには「時間軸」をあらわすフィールドが存在していませんね。
時間軸を表すデータを投入してみましょう。

時間情報を含めたデータの投入

今回はLinuxノードからCurlを打つ想定なのでLinux側で時間を設定してあげようと思います。

簡単なShellスクリプトを用意します。

#!/bin/sh
nowdate=`date -d '9 hour ago' '+%Y-%m-%d'T'%T'`

curl -H "Content-Type: application/json" -X POST "http://127.0.0.1:9200/test_index/_doc " -d '{
   "tags"  : ["remo_state","infra","state","living"],
   "@timestamp" : "'${nowdate}'",
   "humidi": '20.0',
   "illumi": '25.5',
   "temp"  : '29.2'
    }'

先ほどのコマンドにdateで時間を入力しただけのものです。

Curlを送ると登録完了となります。

# sh /test_index_post.sh
{"_index":"test_index","_type":"_doc","_id":"dPBzzmwB_-vP0srr11Kl","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":0,"_primary_term":1}

再度検索してみましょう。

新しく@timestampが入力されていることがわかります。

ただ、この状態ではまだTimestampは時間として機能していません。
IndexPatternを再度作り直す必要があります。

Dateフィールドを含んだIndexPatternの作成

IndexPattern設定画面で先ほど作ったtest_index*を削除します。
そして、その後再度同じ名称でIndexPatternを作成しましょう。

先ほどは選択できなかった「Configre settig」の中の「Timefilter Field name」が設定できるようになっているはずです。

その後作成したIndexを確認し「@timestamp」のTypeが「Date」になっていることを確認。

この状態で再度Discoverで検索してみましょう。

先ほどは無かった緑色のグラフが表示されるはず。
これが見えていればDataフィールドが有効になったIndexとなっています。
この状態ならKibanaの時間指定検索が有効です。

 

とりあえずはここまで!
次回はIndexMappingの設定まで。


参考

・Elasticsearch超入門
・第1回 Elastisearch 入門 インデックスを設計する際に知っておくべき事