如何在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
相关产品推荐
相关产品推荐

