You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Data Elasticsearch Repository的scroll请求中设置查询size

解决Spring Data Elasticsearch 5.1.2中Scroll请求默认Size无法修改的问题

问题背景

使用Spring Data Elasticsearch 5.1.2的ElasticsearchRepository,通过返回Stream<Book>的方法实现Scroll查询批量获取数据时,默认的Scroll批次Size固定为500,尝试添加Pageable参数并传入更大的Size值,生成的查询依然保持Size=500,无法生效。

原因说明

当Repository方法返回类型为Stream时,Spring Data Elasticsearch会自动启用Scroll机制,此时**Pageable参数中的Size设置会被忽略**,转而使用默认的Scroll批次Size(500)。

解决方案

方案1:使用@ScrollSize注解静态指定Size

在Repository的Stream查询方法上添加@ScrollSize注解,直接设置每次Scroll的批次大小:

public interface BookRepository extends ElasticsearchRepository<Book, String> {
    @ScrollSize(1000) // 指定每次Scroll获取1000条数据
    Stream<Book> findByAuthorName(String authorName);
}

调用方式保持原有逻辑即可,无需传入Pageable参数。

方案2:通过ElasticsearchOperations动态构建Scroll查询

如果需要动态设置Scroll Size,可直接使用ElasticsearchOperations手动构建查询,完全控制Scroll的参数:

@Autowired
private ElasticsearchOperations elasticsearchOperations;

public List<Book> getBooksByAuthor(String authorName, int scrollBatchSize) {
    // 构建查询条件
    NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(QueryBuilders.matchQuery("authorName", authorName))
            .withScroll(Scroll.of(Duration.ofMinutes(1))) // 设置Scroll会话超时时间
            .withPageable(Pageable.ofSize(scrollBatchSize)) // 这里的Size会作为Scroll批次大小
            .build();

    // 执行Scroll查询并转换为列表
    try (Stream<Book> bookStream = elasticsearchOperations.stream(searchQuery, Book.class)) {
        return bookStream.toList();
    }
}

验证效果

使用上述任意方案后,生成的Elasticsearch查询中size字段会变为指定的值,例如设置为1000时,查询结构如下:

{
  "_source": { ... },
  "from": 0,
  "query": { ... },
  "size": 1000,
  "track_scores": false,
  "version": true
}

内容的提问来源于stack exchange,提问作者Seanimus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:55:25