本文僅適合java、es都是小白的同志一起學習,大拿的就請直接路過吧。
之前一直使用NET開發項目,採用ElasticSearch+MongoDB模式進行數據存儲,索引。20年單位要求在Java平臺上開發,原有的系統,需要用java定製,開始摸着石頭過河,來寫Java操作Es、MongoDB。
運行環境單位部署的ES爲5.6.16
客戶端對應:
elasticsearch 5.6.16
elasticsearch-rest-high-level-client 5.6.16
elasticsearch-rest-client 5.6.16
記錄第一篇ES統計多個Sum函數,不進行分組(group by)。(對於小白來說,試驗了好久才整出來,主要還是Java語言應用不熟悉吧)
searchSourceBuilder.aggregation(hitagg).aggregation(revertagg); //注意這個 多個aggregation
直接上例子:
/**
* 統計點擊量、回覆量和sum值
* @param ec es連接對象
* @param mtj 統計條件
* @return
* @throws IOException
*/
public static Map<String,Long> FacetHitAndRevertToSum(EsConnect ec, MainInfoJStj mtj) throws Exception {
//定義返回對象
Map<String,Long> reslut = new HashMap<String,Long>();
//定義連接對象
RestHighLevelClient client = RestHighLevelClientBuild.getHighLevelClient(ec.EsIpAddress,ec.EsPort);
//換行檢索條件
BoolQueryBuilder query = SearchMainInfo.combinationSearchMaininfo(mtj);
SearchRequest searchRequest = new SearchRequest();
searchRequest.indices(ec.EsIndex); //指定索引
searchRequest.types(ec.EsType); //指定type
searchRequest.searchType(SearchType.DEFAULT);
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.size(1);
searchSourceBuilder.query(query);
searchSourceBuilder.from(0);
//類似:select sum(hit),sum(revert) from table
//定義求和hit
SumAggregationBuilder hitagg = AggregationBuilders.sum("by_hit").field("hit");
//定義求和revert
SumAggregationBuilder revertagg = AggregationBuilders.sum("by_revert").field("revert");
//注意多個aggregation
searchSourceBuilder.aggregation(hitagg).aggregation(revertagg);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
Sum by_hit = searchResponse.getAggregations().get("by_hit");
Sum by_revert = searchResponse.getAggregations().get("by_revert");
//點擊量和
double hitsum = by_hit.getValue();
//回覆量和
double revertsum = by_revert.getValue();
reslut.put("hit",(long)hitsum);
reslut.put("revert",(long)revertsum);
return reslut;
}