es_分组-分页-TransportClient实现
生活随笔
收集整理的這篇文章主要介紹了
es_分组-分页-TransportClient实现
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
說在前面:
Elasticsearch Java API 有四種實現(xiàn)方式:分別是 TransportClient、RestClient、Jest、Spring Data Elasticsearch。
本文使用第一種方式,也就是 TransportClient 的方式進行實現(xiàn)。想要了解其他三種的方式可以看一下這篇文章:https://blog.csdn.net/qq_3331...
總結(jié):
1、group 之后不能自動分頁,需要手動設(shè)置;
2、size 需要指定,否則會出錯。
group 之后分頁、排序?qū)崿F(xiàn)
需要手動截取分頁對應(yīng)范圍內(nèi)的數(shù)據(jù)。
比如:這里
倒序,獲取到數(shù)據(jù)集的第 (currentPage-1) limit 到 currentPage limit 條記錄;
升序,獲取到數(shù)據(jù)集的 第 buckets.size() - (currentPage - 1) limit 到 buckets.size() - currentPage limit 條記錄。
// 獲取到 response 之后 Aggregations aggregations = response.getAggregations(); Terms carids = aggregations.get("group_car_bayId"); List<? extends Terms.Bucket> buckets = carids.getBuckets(); List<carBean> listCarTgs = new ArrayList<>(); carBean carBean ; // buckets 全部數(shù)據(jù),分頁就是取固定位置的 limit 條數(shù)據(jù) // 默認按照統(tǒng)計之后的數(shù)量倒序, 如果要正序,則第一頁從最后一條開始取 if(buckets.size()>0) {int i=0;if("desc".equalsIgnoreCase(order)) {// 倒序for(Terms.Bucket bucket : buckets){if(i++<(currentPage-1) * limit){continue;}if (i > currentPage * limit) {break;}carBean = new carBean();carBean.setPassTimes((int)bucket.getDocCount());carBean.setBayId(bucket.getKeyAsString().split("_")[2]);carBean.setPlateNumber(bucket.getKeyAsString().split("_")[0]);carBean.setPlateType(bucket.getKeyAsString().split("_")[1]);listCarTgs.add(carBean);}}else if("asc".equalsIgnoreCase(order)) {// 升序for(i = buckets.size() - 1; i >= 0; i--){if(i < buckets.size() - currentPage * limit){break;}if(i > buckets.size() - (currentPage - 1) * limit) continue;;carBean = new carBean();carBean.setPassTimes((int)buckets.get(i).getDocCount());carBean.setBayId(buckets.get(i).getKeyAsString().split("_")[2]);carBean.setPlateNumber(buckets.get(i).getKeyAsString().split("_")[0]);carBean.setPlateType(buckets.get(i).getKeyAsString().split("_")[1]);listCarTgs.add(carBean);}} }單個 group
注意:需要設(shè)置 size
TermsAggregationBuilder tb= AggregationBuilders.terms("group_bayId").field("bay_id").size(Integer.MAX_VALUE);多個 group
以腳本的形式
TermsAggregationBuilder tb= AggregationBuilders.terms("group_carId").script(new Script("doc['plateNumber'].value+'_'+doc['plateType'].value"));tb.subAggregation(AggregationBuilders.topHits("max_time").sort("reportTime", SortOrder.DESC).size(1));再比如:三個 group
BoolQueryBuilder filter = QueryBuilders.boolQuery(); if (carList != null && carList.size() >0) {filter.must(QueryBuilders.termsQuery("car_plate_number", carList.stream().map(SimpleCar:: getPlateNumber).collect(Collectors.toList()))); } if (startTime != null && endTime != null) {filter.filter(QueryBuilders.rangeQuery("timestamp").gt(startTime.getTime()).lt(endTime.getTime())); } else if (startTime != null) {filter.filter(QueryBuilders.rangeQuery("timestamp").gt(startTime.getTime())); } else if (endTime != null) {filter.filter(QueryBuilders.rangeQuery("timestamp").lt(endTime.getTime())); } FieldSortBuilder sort = SortBuilders.fieldSort("transit_times").order("asc".equalsIgnoreCase(order)?SortOrder.ASC:SortOrder.DESC); TermsAggregationBuilder termsAggregationBuilder = AggregationBuilders.terms("group_car_bayId").script(new Script("doc['car_plate_number'].value+'_'+doc['car_plate_type'].value + '_' +doc['bay_id'].value")).size(Integer.MAX_VALUE); SearchResponse response = search(filter, sort, termsAggregationBuilder, elasticsearchProperties.getTgsIndex(), elasticsearchProperties.getTgsType(),(currentPage-1) * limit, 0); Aggregations aggregations = response.getAggregations();例子2:
TermsAggregationBuilder tb= AggregationBuilders.terms("group_bayId").field("bay_id").size(Integer.MAX_VALUE);tb.order(BucketOrder.count(false));總結(jié)
以上是生活随笔為你收集整理的es_分组-分页-TransportClient实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity之定制脚本模板
- 下一篇: onclick事件没有反应的五种可能情况