java使用elasticsearch分组进行聚合查询过程解析
这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java连接elasticsearch进行聚合查询进行相应操作
一:对单个字段进行分组求和
1、表结构图片:
根据任务id分组,分别统计出每个任务id下有多少个文字标题
1.SQL:selectid,count(*)assumfromtaskgroupbytaskid;
javaES连接工具类
publicclassESClientConnectionUtil{
publicstaticTransportClientclient=null;
publicfinalstaticStringHOST="192.168.200.211";//服务器部署
publicfinalstaticIntegerPORT=9301;//端口
publicstaticTransportClientgetESClient(){
System.setProperty("es.set.netty.runtime.available.processors","false");
if(client==null){
synchronized(ESClientConnectionUtil.class){
try{
//设置集群名称
Settingssettings=Settings.builder().put("cluster.name","es5").put("client.transport.sniff",true).build();
//创建client
client=newPreBuiltTransportClient(settings).addTransportAddress(newInetSocketTransportAddress(InetAddress.getByName(HOST),PORT));
}catch(Exceptionex){
ex.printStackTrace();
System.out.println(ex.getMessage());
}
}
}
returnclient;
}
publicstaticTransportClientgetESClientConnection(){
if(client==null){
System.setProperty("es.set.netty.runtime.available.processors","false");
try{
//设置集群名称
Settingssettings=Settings.builder().put("cluster.name","es5").put("client.transport.sniff",true).build();
//创建client
client=newPreBuiltTransportClient(settings).addTransportAddress(newInetSocketTransportAddress(InetAddress.getByName(HOST),PORT));
}catch(Exceptionex){
ex.printStackTrace();
System.out.println(ex.getMessage());
}
}
returnclient;
}
//判断索引是否存在
publicstaticbooleanjudgeIndex(Stringindex){
client=getESClientConnection();
IndicesAdminClientadminClient;
//查询索引是否存在
adminClient=client.admin().indices();
IndicesExistsRequestrequest=newIndicesExistsRequest(index);
IndicesExistsResponseresponses=adminClient.exists(request).actionGet();
if(responses.isExists()){
returntrue;
}
returnfalse;
}
}
javaES语句(根据单列进行分组求和)
//根据任务id分组进行求和
SearchRequestBuildersbuilder=client.prepareSearch("hottopic").setTypes("hot");
//根据taskid进行分组统计,统计出的列别名叫sum
TermsAggregationBuildertermsBuilder=AggregationBuilders.terms("sum").field("taskid");
sbuilder.addAggregation(termsBuilder);
SearchResponseresponses=sbuilder.execute().actionGet();
//得到这个分组的数据集合
Termsterms=responses.getAggregations().get("sum");
Listlists=newArrayList<>();
for(inti=0;i
根据多列进行分组求和
//根据任务id分组进行求和
SearchRequestBuildersbuilder=client.prepareSearch("hottopic").setTypes("hot");
//根据taskid进行分组统计,统计出的列别名叫sum
TermsAggregationBuildertermsBuilder=AggregationBuilders.terms("sum").field("taskid");
//根据第二个字段进行分组
TermsAggregationBuilderaAggregationBuilder2=AggregationBuilders.terms("region_count").field("birthplace");
//如果存在第三个,以此类推;
sbuilder.addAggregation(termsBuilder.subAggregation(aAggregationBuilder2));
SearchResponseresponses=sbuilder.execute().actionGet();
//得到这个分组的数据集合
Termsterms=responses.getAggregations().get("sum");
Listlists=newArrayList<>();
for(inti=0;i
对多个field求max/min/sum/avg
SearchRequestBuilderrequestBuilder=client.prepareSearch("hottopic").setTypes("hot");
//根据taskid进行分组统计,统计别名为sum
TermsAggregationBuilderaggregationBuilder1=AggregationBuilders.terms("sum").field("taskid")
//根据tasktatileid进行升序排列
.order(Order.aggregation("tasktatileid",true));
//求tasktitleid进行求平均数别名为avg_title
AggregationBuilderaggregationBuilder2=AggregationBuilders.avg("avg_title").field("tasktitleid");
//
AggregationBuilderaggregationBuilder3=AggregationBuilders.sum("sum_taskid").field("taskid");
requestBuilder.addAggregation(aggregationBuilder1.subAggregation(aggregationBuilder2).subAggregation(aggregationBuilder3));
SearchResponseresponse=requestBuilder.execute().actionGet();
Termsaggregation=response.getAggregations().get("sum");
Avgterms2=null;
Sumterm3=null;
for(Terms.Bucketbucket:aggregation.getBuckets()){
terms2=bucket.getAggregations().get("avg_title");//org.elasticsearch.search.aggregations.metrics.avg.InternalAvg
term3=bucket.getAggregations().get("sum_taskid");//org.elasticsearch.search.aggregations.metrics.sum.InternalSum
System.out.println("编号="+bucket.getKey()+";平均="+terms2.getValue()+";总="+term3.getValue());
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。