Elasticsearch Scroll查询

    @Override
    public void scrollSearch(String index) {
        // 创建 JestClient 客户端实例
        try {
            // 构建初始的搜索请求
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            searchSourceBuilder.size(10);
            Search search = new Search.Builder(searchSourceBuilder.toString())
                    .addIndex(index)
                    .setParameter(Parameters.SCROLL, "1m")
                    .build();

            // 执行初始搜索请求
            SearchResult searchResult = client.execute(search);
            String scrollId = searchResult.getJsonObject().get("_scroll_id").getAsString();

            // 处理初始搜索结果
            JestResult result = searchResult;
            while (result.isSucceeded()) {
                // 从 JestResult 中获取滚动查询结果
                JsonElement hitsElement = result.getJsonObject().get("hits").getAsJsonObject();
                JsonArray hitsArray = hitsElement.getAsJsonObject().get("hits").getAsJsonArray();

                for (JsonElement hitElement : hitsArray) {
                    JsonObject hitObject = hitElement.getAsJsonObject();
                    String id = hitObject.get("_id").getAsString();
                    JsonObject sourceObject = hitObject.get("_source").getAsJsonObject();
                    // 处理每个 hit
                    log.info("id: {}", id);
                    log.info("source: {}", sourceObject.toString());

                    // 进行其他处理操作
                    // ...
                }

                // 执行滚动请求
                SearchScroll scroll = new SearchScroll.Builder(scrollId, "1m").build();
                result = client.execute(scroll);
                log.info("client execute");

                scrollId = result.getJsonObject().get("_scroll_id").getAsString();
            }
            log.info("清除滚动上下文 开始");
            // 清除滚动上下文
            ClearScroll clearScroll = new ClearScroll.Builder().addScrollId(scrollId).build();
            client.execute(clearScroll);
            log.info("清除滚动上下文 结束");
        } catch (Exception e) {
            log.error("scrollSearch catch error index: {}", index, e);
        }
    }
public void scrollSearch(String index) {
        try {
            int scrollSize = 10;
            Long scrollTime = 1L;

            // 创建初始的搜索请求
            SearchRequest searchRequest = new SearchRequest(index);
            searchRequest.scroll(TimeValue.timeValueMinutes(scrollTime));

            /// 设置搜索条件
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            searchSourceBuilder.query(QueryBuilders.matchAllQuery());
            searchSourceBuilder.size(scrollSize);
            searchRequest.source(searchSourceBuilder);

            // 执行初始搜索请求
            RestHighLevelClient client = getRestHighLevelClient();
            SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
            String scrollId = searchResponse.getScrollId();
            List<SearchHit> hits = Arrays.asList(searchResponse.getHits().getHits());
            while (CollectionUtils.isNotEmpty(hits)) {
                for (SearchHit hit : hits) {
                    String indexName = hit.getIndex();
                    String id = hit.getId();
                    Map<String, Object> source = hit.getSourceAsMap();
                    log.info("scrollSearch indexName: {}, id: {}, source: {}", id, indexName, id, JSON.toJSONString(source));
                }

                // 执行scroll请求继续滚动查询下一批数据
                SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
                scrollRequest.scroll(TimeValue.timeValueMinutes(scrollTime));
                searchResponse = client.scroll(scrollRequest, RequestOptions.DEFAULT);
                scrollId = searchResponse.getScrollId();
                hits = Arrays.asList(searchResponse.getHits().getHits());
                log.info("scrollSearch client execute");
            }

            // 清除scroll上下文
            ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
            clearScrollRequest.addScrollId(scrollId);
            ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
            boolean succeeded = clearScrollResponse.isSucceeded();
            log.info("scrollSearch clearScroll succeeded: {}", succeeded);
        } catch (Exception e) {
            log.error("scrollSearch catch error index: {}", index, e);
        }
    }

参考博客视频教程视频教程

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch scroll 查询是一种用于处理大型数据集合的技术。它允许您在不影响性能的情况下,逐步地检索大量的搜索结果。 以下是一个基本的scroll查询的示例: ``` POST /my_index/_search?scroll=1m { "size": 100, "query": { "match" : { "title" : "elasticsearch" } } } ``` 在上面的查询中,我们指定了一个初始搜索请求,并将scroll参数设置为1分钟。我们还指定了一个"size"参数,该参数指定了每个批次要返回的文档数。在此示例中,我们将每个批次的文档数设置为100。 当我们运行此查询时,Elasticsearch将返回一个初始的搜索结果集,并为我们提供一个scroll_id。我们可以使用此scroll_id执行后续的搜索请求,以逐步检索结果。 以下是一个使用scroll_id执行后续搜索请求的示例: ``` POST /_search/scroll { "scroll": "1m", "scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVRMNGxKUXE2Z2lKSEFZa1VUQQ==" } ``` 在上面的查询中,我们指定了一个scroll_id参数,该参数包含之前搜索请求返回的scroll_id。我们还将scroll参数设置为1分钟,以便Elasticsearch知道我们要继续检索结果。 使用scroll查询时,需要注意以下几点: 1. 每个scroll查询请求都会消耗一些系统资源,因此不应该无限制地使用它。 2. 一旦您完成了scroll查询,您应该及时清除scroll上下文,以释放资源。 3. 如果您的查询需要对大量文档进行排序,scroll查询可能不是最佳选择。排序会增加查询的内存使用量,从而增加查询的资源消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值