ElasticSearch
【読書】AngularJS アプリケーションプログラミング - むだブログ
は、ゆっくり(怠けながら)読書中 前回読んだ本を
高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)
- 作者: Rafal Kuc (lにストローク符号、cにアクサン・テギュ付く),Marek Rogozinski (nにアクサン・テギュ付く)
- 出版社/メーカー: KADOKAWA / アスキー・メディアワークス
- 発売日: 2014/03/25
- メディア: Kindle版
- この商品を含むブログ (3件) を見る
バージョンの関係で記載がありませんが Aggregations の機能について
Aggregations | Elasticsearch Reference [2.4] | Elastic
ファセットに代わる、新しい集計の機能です。 仕事でお試ししたかったので、検証してみる
前提 日付フィールド:created_at
マルチフィールド:keyword
がスキーマとして定義されている。
の前に、日付で絞り込む
curl -XGET 192.168.33.10:9200/sns/message/_search?pretty -d ' { "query":{ "range":{ "created_at":{ "gte":"2016/09/13 00:00", "lte":"2016/09/13 23:59", "format" : "yyyy/MM/dd HH:mm" } } } }'
結果
{ "took" : 22, "timed_out" : false, "_shards" : { "total" : 2, "successful" : 2, "failed" : 0 }, "hits" : { "total" : 99, "max_score" : 1.0, "hits" : [ { "_index" : "sns", "_type" : "message", "_id" : "3", "_score" : 1.0, "_source" : { 省略 "created_at" : "Tue Sep 13 08:25:19 +0000 2016", 省略
で、アグリゲーションする。
日別集計
"aggs"
は"aggregations"の略どちらでも
"by_hour"
"date_histogram"
は、アグリゲーションクエリの種類の一つ 日付範囲ごとの集約してくれます。 1日分を1時間別に集計してるという意味となります。 フォーマットはqueryにも言えますが 書式を統一して検索しています。アグリゲーションは出力も
"time_zone"
大事です。前提で忘れましたがcreated_atはUTCで保存されているので JSTに変換してあげます。
curl -XGET 192.168.33.10:9200/sns/message/_search?pretty -d ' { "query":{ "range":{ "created_at":{ "gte":"2016/09/15 00:00", "lte":"2016/09/15 23:59", "format" : "yyyy/MM/dd HH:mm", "time_zone" : "+09:00" } } }, "aggs" : { "by_hour" : { "date_histogram" : { "field" : "created_at", "interval" : "1h", "format" : "yyyy/MM/dd HH:00", "time_zone" : "+09:00" } } } }'
結果 できた!
省略 "aggregations" : { "by_hour" : { "buckets" : [ { "key_as_string" : "2016/09/15 13:00", "key" : 1473912000000, "doc_count" : 201 }, { "key_as_string" : "2016/09/15 14:00", "key" : 1473915600000, "doc_count" : 201 }, { "key_as_string" : "2016/09/15 15:00", "key" : 1473919200000, "doc_count" : 201 } ] } } }
日別に集計したい場合はこんな感じ
"aggs" : { "by_day" : { "date_histogram" : { "field" : "created_at", "interval" : "day", "format" : "yyyy-MM-dd" } } }
キーワードで集計
キーワードカラムには、配列で複数の単語が保存されいる。 それらを集計する
"terms"
は、値の種類別に集計 集計結果の件数で並び替え 100が上限(SQLのLIMIT)
curl -XGET 192.168.33.10:9200/sns/message/_search?pretty -d ' { "query":{ "range":{ "created_at":{ "gte":"2016/09/13", "lte":"2016/09/20", "format" : "yyyy/MM/dd" } } }, "aggs" : { "keyword_all" : { "value_count" : { "field" : "keyword" } }, "keyword" : { "terms" : { "field" : "keyword", "order" : { "_count" : "desc" }, "size" : 100 } } } }'
結果
省略 "aggregations" : { "keyword_all" : { "value" : 3212 }, "keyword" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "XXX", "doc_count" : 803 }, { "key" : "XXXX", "doc_count" : 704 }, { "key" : "XXX", "doc_count" : 702 }, { "key" : "XXXX", "doc_count" : 402 }, { "key" : "XXXX", "doc_count" : 401 }, { "key" : "XX", "doc_count" : 101 }, { "key" : "XXXXX", "doc_count" : 99 } ] } } }
キーワードと同じようなフィールド、URLも加えちゃう
curl -XGET 192.168.33.10:9200/sns/message/_search?pretty -d ' { "query":{ "range":{ "created_at":{ "gte":"2016/09/13", "lte":"2016/09/20", "format" : "yyyy/MM/dd" } } }, "aggs" : { "keyword_all" : { "value_count" : { "field" : "keyword" } }, "keyword" : { "terms" : { "field" : "keyword", "order" : { "_count" : "desc" }, "size" : 100 } }, "url_all" : { "value_count" : { "field" : "url" } }, "url" : { "terms" : { "field" : "url", "order" : { "_count" : "desc" }, "size" : 100 } } } }'
結果
"aggregations" : { "url_all" : { "value" : 615 }, "keyword_all" : { "value" : 3212 }, "keyword" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "XXXX", "doc_count" : 803 }, { "key" : "ドXXXX販売", "doc_count" : 704 }, { "key" : "XXX", "doc_count" : 702 }, { "key" : "XXXX", "doc_count" : 402 }, { "key" : "XXXX", "doc_count" : 401 }, { "key" : "XXX", "doc_count" : 101 }, { "key" : "XXXXX", "doc_count" : 99 } ] }, "url" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 21, "buckets" : [ { "key" : "http://www.altus5.co.jp/", "doc_count" : 99 }, { "key" : "tp://www.xxxxxx.com/", "doc_count" : 99 }, { "key" : "tp://www.xxxxx.co.jp/", "doc_count" : 99 }, { "key" : "tps://www.xxxxx.co.jp/", "doc_count" : 99 }, { "key" : "tps://twitter.com/xxxxxx/status/776201452247146496", "doc_count" : 35 }, { 長いので省略
1回ででけた! terms、histogram だけですが、こんな感じです。
と結局、読んだこととは関係ないお話し
【読書】AngularJS アプリケーションプログラミング
さしあたり、今、読書・勉強してる本を
これの勉強会をしないといけないので、頑張って読もう
ブログ始めます
読んだ本、漫画、日々のことを書いていこうかと