java操作es聚合操作并显示其他字段_JAVA API操作ES聚合查询

前言

es查询速度比关系型数据库确实快很多,特别是海量数据的查询。但是查询操作比较难受,特别是复杂聚合操作的时候。

官网介绍

java api在官网上有,网上也有很多demo,文章主要分享对聚合的操作。

前置条件

需求是用java api实现下列查询:

SELECT SUM(AssetsId) as sum1,a+b FROM table GROUP BY a+b ORDER BY sum1 DESC LIMIT 0,10;

实际项目里需是对不同的求和进行排序,要实现聚合-求和-排序-分页。

聚合

这里需要把两个字段拼接成一个字段聚合TermsAggregationBuilder tb = AggregationBuilders.terms("all_ip_stat")

.script(new Script("doc['ip_dst_addr'].value+'='+doc['ip_src_addr'].value"));

求和tb.subAggregation(AggregationBuilders.sum("total_bytes")

.script(new Script("doc['orig_bytes'].value+doc['resp_bytes'].value")));

tb.subAggregation(AggregationBuilders.sum("up_total_bytes").field("orig_bytes"));

tb.subAggregation(AggregationBuilders.sum("down_total_bytes").field("resp_bytes"));

排序

对求和的三个字段排序,可以指定字段名tb.order(Terms.Order.aggregation(sortFiled, sort));

sortFiled排序的字段。sort顺序,true升序,false降序。

分页

java api有对查询分页的,但是没搜到对聚合分页,临时的解决办法是先查出来再分页,这个方法有个很明显的弊端,查出来的数据量非常大的时候分页就是灾难,好在需求只需要前N条

es查询都需要指定查询的条数,没指定会只返回10条数据。

对聚合指定tb.size(100);

查询指定SearchRequestBuilder searchRequestBuilder =client.prepareSearch(index).setQuery(query)

.setSize(numPerPage).setFrom(from).setExplain(true)

.addSort("timestamp", SortOrder.DESC);

组装查询条件SearchRequestBuilder searchRequestBuilder = initBuilder(index).setQuery(query)

.addAggregation(tb);

先查出来再分页不是最好的办法,有空在找找有没有好的方法补上。

我的最爱😀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值