elasticsearch使用 scroll 滚动分页实战实例

本文涉及的产品
Elasticsearch Serverless通用抵扣包,测试体验金 200元
简介: elasticsearch使用 scroll 滚动分页实战实例


背景:

es使用page查询时,会有10000条数据限制,超过10000条就报错,查不出来了,不过可以使用scroll滚动分页来做查询。

实战

本例使用es的scroll查询,然后获取每一个scrollid对应的数据,进行自己的业务逻辑处理,最后将业务数据导出。

测试主方法

/**
     * 滚动导出每日行程
     *
     * @param startTime
     * @param endTime
     * @param response
     * @throws IOException
     */
    @GetMapping("/test10")
    public void test10(String startTime, String endTime, HttpServletResponse response) throws IOException {
        //最终导出的数据集合
        List<VehicleRechargeVo> resultList = new ArrayList<>();
        int pageNo = 0;
        //每次获取9000条数据
        int pageSize = 9000;
        //查询条件构建
        SearchQuery searchQuery = getSearchQuery2(startTime, endTime, pageNo, pageSize);
        //组装数据
        List<VehicleRechargeVo> pageList = new ArrayList<>();
        List<BusinessVehicleRecharge> pageContent = null;
        // 滚动查询
        ScrolledPage<BusinessVehicleRecharge> scroll = elasticsearchTemplate.startScroll(5000, searchQuery, BusinessVehicleRecharge.class);
        // 判断是否有内容
        while (scroll.hasContent()) {
            pageContent = scroll.getContent();
            //拿出每一scrollId对应的数数据并处理自己的业务
            pageList = combineData2(pageContent);
            //将上面的数据加入最终集合中
            resultList.addAll(pageList);
            //取下一页,scrollId在es服务器上可能会发生变化,需要用最新的。发起continueScroll请求会重新刷新快照保留时间
            scroll = elasticsearchTemplate.continueScroll(scroll.getScrollId(), 5000, BusinessVehicleRecharge.class);
        }
        // 最后释放查询,必须释放
        elasticsearchTemplate.clearScroll(scroll.getScrollId());
        // 下面是使用easyExcel做导出
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("每日充电明细统计", "UTF-8");
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
        EasyExcel.write(response.getOutputStream(), VehicleRechargeVo.class)
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .sheet("每日充电明细统计")
                .doWrite(resultList);
    }

查询构造器

private SearchQuery getSearchQuery2(String startTime, String endTime, int pageNo, int pageSize) {
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(boolQueryBuilder)
                .withIndices("business_vehicle_XXX").withTypes("_doc")
                .withSort(SortBuilders.fieldSort("dateStr").order(SortOrder.ASC))
                .withPageable(PageRequest.of(pageNo, pageSize))
                .withSourceFilter(
                        new FetchSourceFilterBuilder().withIncludes("dateStr", "vin", "startTime", "endTime",
                                "rechargePower", "rechargeTimes", "socStartTime", "socEndTime")
                                .build())
                .build();
        return searchQuery;
    }

对每一scroll Id对应的分页数据做些处理

combineData2

private List<VehicleRechargeVo> combineData2(List<BusinessVehicleRecharge> content) {
        List<VehicleRechargeVo> list = new ArrayList<>();
        content.stream().forEach(item -> {
            if (StringUtils.isNotBlank(item.getDateStr())) {
                VehicleRechargeVo rechargeVo = new VehicleRechargeVo();
                rechargeVo.setDateStr(item.getDateStr());
                rechargeVo.setVin(item.getVin());
                rechargeVo.setStartTime(item.getStartTime());
                rechargeVo.setEndTime(item.getEndTime());
                rechargeVo.setSocStartTime(item.getSocStartTime());
                rechargeVo.setSocEndTime(item.getSocEndTime());
                rechargeVo.setRechargePower(item.getRechargePower());
                rechargeVo.setRechargeTimes(item.getRechargeTimes());
                list.add(rechargeVo);
            }
        });
//        Collections.sort(list);
        return list;
    }

导出实体类

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * @Auther: hfl
 * @Date: 2022/3/15
 * @Description: 导出充电明细
 */
@Data
public class VehicleRechargeVo implements Serializable,Comparable<VehicleRechargeVo> {
    @ExcelProperty(value = "日期")
    private String dateStr;
    @ExcelProperty(value = "VIN")
    private String vin;
    /**
     * 充电开始时间
     */
    @ExcelProperty(value = "充电开始时间")
    private String startTime;
    /**
     * 充电结束时间
     */
    @ExcelProperty(value = "充电结束时间")
    private String endTime;
    /**
     * 充电电量 kw.h
     */
    @ExcelProperty(value = "充电电量 kw.h")
    private float rechargePower;
    /**
     * 充电时长 h
     */
    @ExcelProperty(value = "充电时长 h")
    private float rechargeTimes;
    /**
     * SOC开始时间
     */
    @ExcelProperty(value = "SOC开始时间")
    private float socStartTime;
    /**
     * SOC结束时间
     */
    @ExcelProperty(value = "SOC结束时间")
    private float socEndTime;
    @Override
    public int compareTo(VehicleRechargeVo o) {
        return this.dateStr.compareTo(o.dateStr);
    }
}


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
2月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
存储 运维 监控
超越传统模型:从零开始构建高效的日志分析平台——基于Elasticsearch的实战指南
【10月更文挑战第8天】随着互联网应用和微服务架构的普及,系统产生的日志数据量日益增长。有效地收集、存储、检索和分析这些日志对于监控系统健康状态、快速定位问题以及优化性能至关重要。Elasticsearch 作为一种分布式的搜索和分析引擎,以其强大的全文检索能力和实时数据分析能力成为日志处理的理想选择。
840 6
|
8月前
|
人工智能 自然语言处理 运维
让搜索引擎“更懂你”:AI × Elasticsearch MCP Server 开源实战
本文介绍基于Model Context Protocol (MCP)标准的Elasticsearch MCP Server,它为AI助手(如Claude、Cursor等)提供与Elasticsearch数据源交互的能力。文章涵盖MCP概念、Elasticsearch MCP Server的功能特性及实际应用场景,例如数据探索、开发辅助。通过自然语言处理,用户无需掌握复杂查询语法即可操作Elasticsearch,显著降低使用门槛并提升效率。项目开源地址:&lt;https://github.com/awesimon/elasticsearch-mcp&gt;,欢迎体验与反馈。
2079 1
|
测试技术 API 开发工具
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
ElasticSearch7.6.x 模板及滚动索引创建及注意事项
196 8
|
缓存 关系型数据库 API
京东面试题:ElasticSearch深度分页解决方案!
京东面试题:ElasticSearch深度分页解决方案!
262 0
|
存储 数据采集 数据处理
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
数据处理神器Elasticsearch_Pipeline:原理、配置与实战指南
654 12
|
自然语言处理 前端开发 Java
ElasticSearch 实现分词全文检索 - Scroll 深分页
ElasticSearch 实现分词全文检索 - Scroll 深分页
187 0
|
数据库
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
面试题ES问题之Elasticsearch的排序分页和高亮功能如何解决
187 0
|
缓存 数据处理 数据安全/隐私保护
Elasticsearch索引状态管理实战指南
Elasticsearch索引状态管理实战指南
267 0
|
存储 数据库 开发者
Elasticsearch中的三种分页策略深度解析:原理、使用及对比
Elasticsearch中的三种分页策略深度解析:原理、使用及对比

热门文章

最新文章