【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;
        });
相关推荐
core51212 小时前
Elasticsearch 车牌号片段搜索:n-gram 倒排索引实战方案
elasticsearch·n-gram·索引·倒排索引·号牌·片段
এ慕ོ冬℘゜12 小时前
ES Promise.all/ Promise.race
前端·javascript·elasticsearch
Sayai15 小时前
Elasticsearch 日志写入链路调优实战:ingest pipeline 补时间戳、时区偏移修复与按值类型路由(附 translog 实测)
大数据·运维·elasticsearch·搜索引擎·性能优化
总爱写点小BUG16 小时前
git-tidy:一个把「提交规范治理」做成闭环的 Git 桌面客户端
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客1 天前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
BreezeJiang2 天前
写了 Dockerfile 却没生效:ES + Kibana 的 compose 配置里,藏着三个反直觉的点
elasticsearch
Elasticsearch3 天前
Elastic 计划利用 NVIDIA RTX GPU 将 Jina 模型推理速度提升至 8 倍
elasticsearch
Elastic 中国社区官方博客3 天前
告别繁琐控制台:Kabanos 如何将 MongoDB Compass 的易用性带入 Elasticsearch
大数据·数据库·mongodb·elasticsearch·搜索引擎·全文检索
Elastic 中国社区官方博客3 天前
控制告警如何触发、恢复和发送通知:Elastic 可观测性中的 Kibana 通用告警
大数据·数据库·安全·elasticsearch·搜索引擎·全文检索·es
深海里的鱼(・ω<)★3 天前
SMB备份导致的 Gitea 分支推送成功但界面不可见故障复盘
大数据·elasticsearch·gitea