ElasticSearchのAggregationを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触っている人はどんどんサンプルコード残してくださいお願いします。