资讯专栏INFORMATION COLUMN

es_分组-分页-TransportClient实现

Jaden / 2762人阅读

摘要:说在前面有四种实现方式分别是。本文使用第一种方式,也就是的方式进行实现。之后分页排序实现需要手动截取分页对应范围内的数据。

说在前面:

Elasticsearch Java API 有四种实现方式:分别是 TransportClient、RestClient、Jest、Spring Data Elasticsearch。
本文使用第一种方式,也就是 TransportClient 的方式进行实现。想要了解其他三种的方式可以看一下这篇文章:https://blog.csdn.net/qq_3331...

总结:

1、group 之后不能自动分页,需要手动设置;

2、size 需要指定,否则会出错。


group 之后分页、排序实现

需要手动截取分页对应范围内的数据。

比如:这里

倒序,获取到数据集的第 (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 buckets =  carids.getBuckets();
List listCarTgs = 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);
        }
    }
}
单个 group

注意:需要设置 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

相关文章

  • Spring Boot 中使用 Java API 调用 Elasticsearch

    摘要:当前最新的版本为,比较应用广泛的为,直到推出了版本,将版本号调为。这是为了和和等产品版本号进行统一。并在高效的提供查询服务的同时,自动协调每个节点的下线以及上线情况。 ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务,搜索服务,大数据准实时分析等。一般用于提供一些提供复杂搜索的应用。 ElasticSearch 提供了一套基于restful风格的全文检索服务...

    shleyZ 评论0 收藏0
  • elasticSearch升级记录 ver.1.4.5→ver.5.2.0

    摘要:前言项目中的由升级至。已经弃用,相应功能由实现,直接替换即可。构造报文调整调整成弃用,相关功能由实现。类型表示精确查找的文本,不需要进行分词。查询字段时,使用表示改版后,设置了的情况下,也要设置,否则会报。 前言 项目中的es由ver.1.4.5升级至ver.5.2.0。 安装elasticSearch #下载 wget https://artifacts.elastic.co/dow...

    姘搁『 评论0 收藏0
  • elasticSearch升级记录 ver.1.4.5→ver.5.2.0

    摘要:前言项目中的由升级至。已经弃用,相应功能由实现,直接替换即可。构造报文调整调整成弃用,相关功能由实现。类型表示精确查找的文本,不需要进行分词。查询字段时,使用表示改版后,设置了的情况下,也要设置,否则会报。 前言 项目中的es由ver.1.4.5升级至ver.5.2.0。 安装elasticSearch #下载 wget https://artifacts.elastic.co/dow...

    idealcn 评论0 收藏0
  • Elasticsearch就这么简单

    摘要:一前言最近有点想弄一个站内搜索的功能,之前学过了,后来又听过这个名词。接着在了解全文搜索的时候就发现了这个,他也是以为基础的。仅仅会一些简单的命令,等真正去用到的时候再慢慢啃吧。文章给出的是以的方式打包下载。 一、前言 最近有点想弄一个站内搜索的功能,之前学过了Lucene,后来又听过Solr这个名词。接着在了解全文搜索的时候就发现了Elasticsearch这个,他也是以Lucene...

    NikoManiac 评论0 收藏0
  • Elasticsearch就这么简单

    摘要:一前言最近有点想弄一个站内搜索的功能,之前学过了,后来又听过这个名词。接着在了解全文搜索的时候就发现了这个,他也是以为基础的。仅仅会一些简单的命令,等真正去用到的时候再慢慢啃吧。文章给出的是以的方式打包下载。 一、前言 最近有点想弄一个站内搜索的功能,之前学过了Lucene,后来又听过Solr这个名词。接着在了解全文搜索的时候就发现了Elasticsearch这个,他也是以Lucene...

    kun_jian 评论0 收藏0

发表评论

0条评论

Jaden

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<