摘要:说在前面有四种实现方式分别是。本文使用第一种方式,也就是的方式进行实现。之后分页排序实现需要手动截取分页对应范围内的数据。
说在前面:
Elasticsearch Java API 有四种实现方式:分别是 TransportClient、RestClient、Jest、Spring Data Elasticsearch。
本文使用第一种方式,也就是 TransportClient 的方式进行实现。想要了解其他三种的方式可以看一下这篇文章:https://blog.csdn.net/qq_3331...
1、group 之后不能自动分页,需要手动设置;
2、size 需要指定,否则会出错。
需要手动截取分页对应范围内的数据。
比如:这里
倒序,获取到数据集的第 (currentPage-1) limit 到 currentPage limit 条记录;
升序,获取到数据集的 第 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单个 grouplistCarTgs = new ArrayList<>(); carBean carBean ; // buckets 全部数据,分页就是取固定位置的 limit 条数据 // 默认按照统计之后的数量倒序, 如果要正序,则第一页从最后一条开始取 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); } } }
注意:需要设置 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));
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/34362.html
摘要:当前最新的版本为,比较应用广泛的为,直到推出了版本,将版本号调为。这是为了和和等产品版本号进行统一。并在高效的提供查询服务的同时,自动协调每个节点的下线以及上线情况。 ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务,搜索服务,大数据准实时分析等。一般用于提供一些提供复杂搜索的应用。 ElasticSearch 提供了一套基于restful风格的全文检索服务...
摘要:前言项目中的由升级至。已经弃用,相应功能由实现,直接替换即可。构造报文调整调整成弃用,相关功能由实现。类型表示精确查找的文本,不需要进行分词。查询字段时,使用表示改版后,设置了的情况下,也要设置,否则会报。 前言 项目中的es由ver.1.4.5升级至ver.5.2.0。 安装elasticSearch #下载 wget https://artifacts.elastic.co/dow...
摘要:前言项目中的由升级至。已经弃用,相应功能由实现,直接替换即可。构造报文调整调整成弃用,相关功能由实现。类型表示精确查找的文本,不需要进行分词。查询字段时,使用表示改版后,设置了的情况下,也要设置,否则会报。 前言 项目中的es由ver.1.4.5升级至ver.5.2.0。 安装elasticSearch #下载 wget https://artifacts.elastic.co/dow...
摘要:一前言最近有点想弄一个站内搜索的功能,之前学过了,后来又听过这个名词。接着在了解全文搜索的时候就发现了这个,他也是以为基础的。仅仅会一些简单的命令,等真正去用到的时候再慢慢啃吧。文章给出的是以的方式打包下载。 一、前言 最近有点想弄一个站内搜索的功能,之前学过了Lucene,后来又听过Solr这个名词。接着在了解全文搜索的时候就发现了Elasticsearch这个,他也是以Lucene...
摘要:一前言最近有点想弄一个站内搜索的功能,之前学过了,后来又听过这个名词。接着在了解全文搜索的时候就发现了这个,他也是以为基础的。仅仅会一些简单的命令,等真正去用到的时候再慢慢啃吧。文章给出的是以的方式打包下载。 一、前言 最近有点想弄一个站内搜索的功能,之前学过了Lucene,后来又听过Solr这个名词。接着在了解全文搜索的时候就发现了Elasticsearch这个,他也是以Lucene...
阅读 922·2023-04-26 00:12
阅读 2966·2021-11-17 09:33
阅读 913·2021-10-13 09:40
阅读 883·2021-09-04 16:45
阅读 972·2021-09-02 15:40
阅读 1520·2019-08-30 15:56
阅读 2711·2019-08-30 15:53
阅读 3379·2019-08-30 11:23