py-py’s blog

何か書くよ

Elasticsearch

データ分析基盤構築入門 Fluentd、Elasticsearch、Kibanaによるログ収集と可視化

上記を買ってきたので、とりあえずElasticsearch部分だけ学習した。

その部分をまとめる。

アーキテクチャ

ノード

Easticsearchの1プロセス相当。同一サーバ内で複数ノード起動が可能。ノード名はデフォルトでUUID.

クラスタ

複数のノードを1つのElasticsearchとして動作させることが可能。ノード群をクラスタという。クラスタ名のデフォルトはelasticsearch。

ドキュメント

Elasticsearchが扱うデータの最小単位で、基本json形式。
RDBの1レコードに相当する。

フィールド

RDBのカラムに相当。フィールド毎に型指定が可能。

インデックス

ドキュメントの集合。RDBのテーブル相当(でよいのか?)
RDBのDBに相当
インデックスをノードに分散させる単位がシャード。

タイプ

インデックスに登録するドキュメントを分類する機能。
ドキュメントはタイプを一つ選択できる。

シャード

分割したインデックスのこと。

マッピング

インデックスに保存するデータ構造を定義する際に利用する。
タイプ毎にドキュメントのフィールドの特徴を記述する。

実際にElasticsearchをダウンロードしてElasticsearchを起動してみたところある程度ログが出たところで動かない。
エラーログっぽいものも出ていない。Ctrl+cで終了しようとしたところ
「バッチジョブの終了」云々と何か動いているのは確認。
調べるのは時間かかりそうと思い、とりあえず先に進む。

インデックスの作成

ElasticsearchはインデックスをURLにアクセスすることで作成できる

curl -XPUT http://localhost:9200/インデックス名

注意点として、Elasticsearch5.0からPUTのみ対応していること。

インデックスの削除

コマンドの引数を「XPUT」から「XDELETE」に変更するだけ

curl -XDELETE http://localhost:9200/インデックス名

データの取り込み

curl -XPUT http://localhost:9200/インデックス名/タイプ名/-オプション  
"リクエストボディ(例えばjsonなど)  
"

データの検索

curl -XGET http://localhost:9200/インデックス名/_search -d '  
{  
検索条件  
}  
'

検索条件の部分に条件を指定する。指定する条件は主に以下の通り。

パラメータ デフォルト 説明
query - 検索条件。クエリDSLと呼ばれるものが複数あり
from 0 検索結果に含まれるデータの開始位置
size 10 検索結果に含まれるデータのサイズ
sort _score ソートの指定。asc/descで順序指定
_source - 検索結果に含むフィールドの指定
aggs - 検索結果に含まれるデータに対し、集計処理を施す

全件検索

検索条件を指定せず、登録済データをすべて取得するクエリDSL

curl -XGET http://localhost:9200/インデックス名/_search -d '  
{  
 "query":{  
  "match_all":{}  
 }  
}  
'  

取得結果

項目 説明
took 検索にかかった時間
hits 検索結果情報
hits.total 検索条件にヒットした件数
hits.hits 検索にヒットしたドキュメントの配列

Aggregation

aggregationは取得したデータに対して集計を行う機能。

curl -XGET http://localhost:9200/インデックス名/_search -d '  
{  
 "query":{  
  "match_all":{}  
 }  
},  
 "aggs":{  
  "request_aggs":{  
   "terms":{  
    "field":"request",  
     "size":10  
   }  
  }  
 }  
'  

上記例は

「全件検索結果に対し、requestフィールドの値ごとのデータ件数を取得するaggregationを指定する」
(aggsはaggregationsの省略を表し、どちらでも使ってもよい。)
(また、request_aggsは、aggregationで取得した結果のラベル、aggregationの名前だと思えばよい。)
「terms」がaggregationのタイプ。そのほかのタイプは以下に記載。

タイプ 説明
terms インデックスの値ごとにドキュメント数を集計
range インデックスの値を元に指定された範囲でドキュメントを集計
histogram インデックスの数値データを元に、指定された間隔でドキュメント数を集計
statistical インデックスの数値フィールドの統計値
filter 指定されたクエリのドキュメント数を集計

Elasticsearchを利用して検索結果を取得できた。

マッピング

本書を読んでだとよくわからなかった。

この記事を読んだらマッピングというのはRDBのテーブル定義
だということが分かる。

参考記事

マッピングの箇所が非常に適当になったが、とりあえずまとめた。

【追記】

データベースとしてのElasticsearch