読者です 読者をやめる 読者になる 読者になる

サナギわさわさ.json

サナギさんとキルミーベイベーとプログラミングが好きです

ElasticSearchのAggregationをJavaで書く

ElasticSearch Java プログラミング

ElasticSearchには1.0.0からAggregationという機能が導入されました。SQLで言うSumやGroup Byを簡単に行える機能です。詳しくは公式サイト見てください。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html

Aggregationは便利なんですが、Javaのサンプルが中々見つからなくて少し苦労したのでJavaのサンプルプログラムを備忘録として残しておきます。
Java以外のサンプルは結構あるので、Java以外の人はそっち見た方が早いと思います。
参考:http://qiita.com/jtodo/items/be053be4aa704e6c57d0

普通のGroup By

特定のフィールドごとの件数と集計値(合計、平均)を求めるSQL

SELECT  
fieldA, COUNT(fieldA), SUM(fieldB), AVG(fieldB) 
from table   
group by fieldA;

これをElasticSearchで置き換えるとこうなります。

2つ以上のカラムに対するGroup By

Group Byの対象カラムが2つ以上になる場合でも基本的には同じです。

SELECT  
fieldA, fieldC, SUM(fieldB)
from table   
group by fieldA,fieldC;

日付別のGroup By

使用頻度が高いと思われる、SQLで言うところのgroup by DATE(日付)です。
これはDate Histogran Aggregationを使って行うことができます。当然日付別だけでなく1時間単位や15分単位での集計も可能です。
参考URL : https://www.elastic.co/guide/en/elasticsearch/reference/1.6/search-aggregations-bucket-datehistogram-aggregation.html

SELECT  
DATE(create_at),fieldA,SUM(fieldB) 
from table   
group by DATE(create_at),fieldA;

Where + Group By

これはあんまり書くまでもないですが、一応書きます。

SELECT  
fieldA, COUNT(fieldA)
from table   
WHERE fieldC = "hoge" 
AND fieldD = "huga" 
AND fieldB > 10
AND fieldB < 100 
group by fieldA;

以上です。JavaでES触っている人はどんどんサンプルコード残してくださいお願いします。