当前位置: 首页 > article >正文

【Elasticsearch】使用游标遍历所有数据

 通过使用Elasticsearch 的内置游标方式,遍历所有数据

部分代码需要参考本专题的前面几个章节内容

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.Result;
import co.elastic.clients.elasticsearch._types.query_dsl.MatchAllQuery;
import co.elastic.clients.elasticsearch.core.*;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.json.JsonData;


private ElasticsearchClient esClient;

public  void scrollAllData(EsDocReq req, Function<List<? extends Hit<? extends Map>>, Boolean> processHits) {
        String indexName = req.getIndexLib();
        log.info("遍历数据开始" + indexName);

        final String timeout = "5m";
        try {
            SearchRequest searchRequest = SearchRequest.of(i ->
                    {
                        i.index(indexName)
                                .scroll(s -> s.time(timeout))
                                .query(MatchAllQuery.of(q -> q)._toQuery())
                                .size(100);
                        if(null != req.getColumns()){
                            i.source(src -> src.filter(f -> f.includes(req.getColumns())));
                        }
                        return i;
                    }
            );

            Map<String, Object> dataMap = new HashMap<>();
            SearchResponse<? extends Map> searchResponse = esClient.search(searchRequest, dataMap.getClass());

            Map<String, String> scollMap = new HashMap<>();
            String key = "scroll";
            scollMap.put(key, searchResponse.scrollId());

            List<? extends Hit<? extends Map>> hits = searchResponse.hits().hits();

            processHits.apply(hits);

            while (!hits.isEmpty()) {
                ScrollRequest scrollRequest = ScrollRequest.of(i -> i
                        .scrollId(scollMap.get(key))
                        .scroll(s -> s.time(timeout))
                );

                ScrollResponse<? extends Map> scrollResponse = esClient.scroll(scrollRequest, dataMap.getClass());

                scollMap.put(key, scrollResponse.scrollId());
                hits = scrollResponse.hits().hits();

                processHits.apply(hits);
            }

            ClearScrollRequest clearScrollRequest = ClearScrollRequest.of(i -> i.scrollId(scollMap.get(key)));
            ClearScrollResponse clearScrollResponse = esClient.clearScroll(clearScrollRequest);
            if (clearScrollResponse.succeeded()) {
                log.info("遍历数据结束");
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

1、EsDocReq  为自定义的请求对象

2、Function<List<? extends Hit<? extends Map>>, Boolean> processHits 用于实际遍历中处理读取的数据。【根据需要自定义函数,并以参数传递

3、timeout = "5m"; 表示超时时间5分钟

4、 i.source 表示需要返回的指定字段

5、结尾需要清理游标 ClearScrollRequest 

以下是 调用函数说明示例:

EsDocReq req = new EsDocReq();

scrollAllData(req, fn -> {
            for (Hit<? extends Map> hit : fn) {
                try {
                    String esIndex = hit.id(); 
                    // TODO 实际业务
                    
                } catch (Exception e) { 
                    log.error(e.getMessage(), e);
                }
            }
            return true;
        });


http://www.kler.cn/a/445988.html

相关文章:

  • 渗透测试-前端加密分析之RSA加密登录(密钥来源服务器)
  • Restaurants WebAPI(三)——Serilog/
  • 深入浅出支持向量机(SVM)
  • 圣诞快乐(h5 css js(圣诞树))
  • aioice里面candidate固定UDP端口测试
  • 线程知识总结(一)
  • Pytorch实现轻量去雾网络
  • 【GCC】2015: draft-alvestrand-rmcat-congestion-03 机器翻译
  • 智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之3(百度文库答问 之1)
  • JSP脚本小程序和JSP表达式
  • VS Code Copilot 与 Cursor 对比
  • Antd react上传图片格式限制
  • [创业之路-197]:华为的发展路径启示
  • 【和春笋一起学C++】while语句和类型别名
  • [flutter] 安卓编译配置
  • 异步JavaScript,Ajax,API
  • 【Prompt Engineering】4 推断
  • 登山第十六梯:深度恢复——解决机器人近视问题
  • 2、C#基于.net framework的应用开发实战编程 - 设计(二、二) - 编程手把手系列文章...
  • 获取显示器(主/副屏)友好名称(FriendlyName)
  • Android 设置沉浸式状态栏
  • shell7
  • 【C++】刷题强训(day16)--字符串替换、神奇数、DNA序列
  • MyBatis-Plus中isNull与SQL语法详解:处理空值的正确姿势
  • CICD篇之通过Jenkins中书写pipeline构建编译打包发布流程
  • Power Automate 简介