1. 程式人生 > >Elasticsearch Aggregation 多個欄位分組統計 Java API實現

Elasticsearch Aggregation 多個欄位分組統計 Java API實現

現有索引資料:

index:school

type:student

---------------------------------------------------

{"grade":"1", "class":"1", "name":"xiao 1"}

{"grade":"1", "class":"1", "name":"xiao 2"}

{"grade":"1", "class":"2", "name":"xiao 3"}

{"grade":"1", "class":"2", "name":"xiao 4"}

{"grade":"1", "class":"2", "name":"xiao 5"}

Java分組統計年級和班級學生個數,如SQL: SELECT grade,class,count(1) FROM student GROUP BY grade,class;

package test;

import java.util.Iterator;

import java.util.Map;

import org.elasticsearch.action.search.SearchRequestBuilder;

import org.elasticsearch.action.search.SearchResponse;

import org.elasticsearch.action.search.SearchType;

import org.elasticsearch.search.aggregations.Aggregation;

import org.elasticsearch.search.aggregations.AggregationBuilders;

import org.elasticsearch.search.aggregations.bucket.terms.StringTerms;

import org.elasticsearch.search.aggregations.bucket.terms.Terms.Bucket;

import org.elasticsearch.search.aggregations.bucket.terms.TermsBuilder;

import org.junit.Test;

import utils.NesUtils;

public class TestAggregation

{

@Test

public void testAggregation()

{

SearchRequestBuilder srb = NesUtils.getSearcher("school");

srb.setTypes("student");

srb.setSearchType(SearchType.COUNT);

TermsBuilder gradeTermsBuilder = AggregationBuilders.terms("gradeAgg").field("grade");

TermsBuilder classTermsBuilder = AggregationBuilders.terms("classAgg").field("class");

gradeTermsBuilder.subAggregation(classTermsBuilder);

srb.addAggregation(gradeTermsBuilder);

SearchResponse sr = srb.execute().actionGet();

Map<String, Aggregation> aggMap = sr.getAggregations().asMap();

StringTerms gradeTerms = (StringTerms) aggMap.get("gradeAgg");

Iterator<Bucket> gradeBucketIt = gradeTerms.getBuckets().iterator();

while(gradeBucketIt.hasNext())

{

Bucket gradeBucket = gradeBucketIt.next();

System.out.println(gradeBucket.getKey() + "年級有" + gradeBucket.getDocCount() +"個學生。");

StringTerms classTerms = (StringTerms) gradeBucket.getAggregations().asMap().get("classAgg");

Iterator<Bucket> classBucketIt = classTerms.getBuckets().iterator();

while(classBucketIt.hasNext())

{

Bucket classBucket = classBucketIt.next();

System.out.println(gradeBucket.getKey() + "年級" +classBucket.getKey() + "班有" + classBucket.getDocCount() +"個學生。");

}

System.out.println();

}

}

}

執行完成輸出結果

---------------------------------------------------

1年級有5個學生。

1年級2班有3個學生。

1年級1班有2個學生。


相關推薦

Elasticsearch Aggregation 分組統計 Java API實現

現有索引資料:index:schooltype:student---------------------------------------------------{"grade":"1", "class":"1", "name":"xiao 1"}{"grade":"1",

oracle資料中一個中存在值 進行分組統計查詢

如圖我有這樣的兩條資料  我要根據unit_name這個欄位中的多個值進行分組統計數量 我要顯示的格式如下 單位名稱        數量 測試單位        1 dd         

MYSQL GROUP BY 對進行分組

在平時的開發任務中我們經常會用到MYSQL的GROUP BY分組, 用來獲取資料表中以分組欄位為依據的統計資料。比如有一個學生選課表,表結構如下: Table: Subject_Selection Subject Semester Attendee -------

mysql group by 對進行分組

在平時的開發任務中我們經常會用到MYSQL的GROUP BY分組, 用來獲取資料表中以分組欄位為依據的統計資料。比如有一個學生選課表,表結構如下: Table: Subject_Selection Subject Semester Att

elasticsearch系列-ES對聚合,select A,B,COUNT(*) from table group by A,B

ES對多個欄位聚合,select A,B,COUNT(*)from table group by A,B 假設有下表 NAME SEX PROF 李誠 男 副教授 張旭 男 講師 王萍 女 助教 劉冰

mongodb分組統計並求最大統計失敗時間

一、普通求總數 db.sendlog.find({"event":1000000000001}).count() 二、分組統計並求最大時間 db.sendlog.group({

js把頁面明細行資料組成陣列,並獲取某個值最大和其次大的資料賦值到文字框;

要求:前臺新增頁面的明細行中,有列下拉框選擇分類和一列付款金額的輸入框,明細行上面有兩個輸入框,要求在明細行選擇的分類和付款金額中篩選付款金額之和第一高的的分類和金額、第二高的分類和金額自動複製到上面的兩個輸入框中; 思路:迴圈明細表,把所有的明細表的分類和付款金額放到json陣列中,然後迴圈j

java list按照元素物件的指定屬性進行排序

ListUtils.Java---功能類  http://blog.csdn.net/jiangyu1013/article/details/53894218 [java] view plain copy     packa

Index 組合索引 Composite Index 中的順序

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

mysql和oracle查詢出的一條結果中的拼接

1,mysql concat('a','b','c')和concat_ws('a','b','c')的區別:前者如果有某個值為空,結果為空;後者如果有某個值為空,可以忽略這個控制 SELECT concat_ws('',FORE_TWO,THIRD_POSITION,FOURTH_POSIT

MySQL中插入的方法

在開發過程中,很多時候,根據需求,我們需要重新在表中新增幾個欄位。 在本地測試成功後,我們需要將自己的sql語句,提交到SVN,在版本升級的時候對現網上的資料庫表進行更新。 那麼如何寫插入欄位的sql語句呢?下面這個例子可以做一個簡單地示例: alter table ip_doma

mysql一張表關聯另一張表查詢

如下:一張訂單表多個欄位關聯使用者表: 1.連結串列查詢 SELECT cu.id AS 'id',cu.version AS 'version',cu.cid AS 'cid',cu.uid AS 'uid',cu.shopName AS 'shopName',cu.address AS 'addre

根據搜尋

package loaderman.search; import java.util.ArrayList; import java.util.List; import loaderman.entity.Article; import loaderman.util.LuceneUtil;

查詢oracle資料庫是否有重複資料(根據判斷)

根據多個欄位查詢重複資料的總條數: sql = "select count(*) from tablea a where (a.askname, a.atime) in (select askname,atime from tablea group by askname,atime having count

group by

首先group by 的簡單說明:    group by 一般和聚合函式一起使用才有意義,比如 count sum avg等,使用group by的兩個要素:    (1) 出現在select後面的欄位 要麼是是聚合函式中的,要麼就是group by 中的.    (2)

對於傳一個引數去資料庫裡匹配的資料查詢

舉個例子: <if test="customName != null and customName != ''"> and t.customName like '%'+#{customName}+'%' or t.customType = #{customName}

group by

首先group by 的簡單說明:    group by 一般和聚合函式一起使用才有意義,比如 count sum avg等,使用group by的兩個要素:    (1) 出現在select後面的欄位 要麼是是聚合函式中的,要麼就是group by 中的.    (2) 要篩選結果 可以先使用where

mybatis 實現批量更新 更新條記錄為為不同的值

更新多條記錄為多個欄位為不同的值 比較普通的寫法,是通過迴圈,依次執行update語句。 Mybatis寫法如下: <update id="updateBatch" parameterType="java.util.List"> <foreach coll

SSM關聯碼錶的顯示中文流程以及sql寫法

場景描述: 實體Model中存放的是數字, 與數字對應的中文狀態存放在碼錶中, 要關聯碼錶在jsp頁面來顯示對應的中文狀態。 碼錶欄位: 要顯示的效果: 程式碼思路: 1.編寫Model類的擴充套件類,此擴充套件類要繼承原來的Model類 public

@JoinColumn 匹配關聯

兩張表結構如下 TABLE_A: ID, COLA1, COLA2 TABLE_B: ID, A_ID, COLB1, COLB2 A和B是一對多的關係。 我在B的BEAN上面,通過Anotation建立如下關係。 @ManyToOne(cas