首页 > 解决方案 > 具有 Pageable 的 Spring 数据弹性搜索存储库仅重新调整 10000 个文档

问题描述

我在 elasticsearch 中有 17364 个文档的索引。

$curl http://localhost:9200/performance/_count
{"count":17364,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}

Spring数据存储库,

public interface TestRepository extends ElasticsearchRepository<Transaction, String> {
}

逐页获取所有文档并打印:

public void testReport() {

  int page = 0, pageSize = 1000;
  Pageable of = PageRequest.of(page, pageSize);

  Page<Transaction> all = testRepository.findAll(of);
  int numberOfPages = all.getTotalPages();

  log.info("All pages: {},  {}", numberOfPages, all.getTotalElements());
  do {
     log.info("Current page: {}, {}", of.getPageNumber(), of.getPageSize());
     for (Transaction txn : all) {
        log.info(mapper.writeValueAsString(txn));
     }
  } while ((of = of.next()) != null && (transactionRepository.findAll(of)) != null);

}

尽管索引有 17364 个文档,但此代码仅返回 10000 个文档。你能帮我找出为什么会这样吗?

标签: spring-bootelasticsearchspring-data-elasticsearch

解决方案


我看到两个选项:

A. 由于您只有 17364 个文档,您可以index.max_result_window将索引中的设置增加到(例如)20000,这样您就可以分页到最后:

PUT performance/_settings
{
  "index.max_result_window": 20000
}

B. 如果您有更大的索引和/或index.max_result_window出于任何原因无法增加限制,那么您需要利用Scroll API。Spring Data ES支持两种方式来做到这一点。

第一种方法涉及利用ElasticsearchTemplate.searchForStream()内部使用 Scroll API的方法

SearchHitsIterator<Transaction> stream = elasticsearchTemplate.searchForStream(searchQuery, Transaction.class, "performance");

第二种方法更底层一些。您需要使用返回 a 的方法修改存储库定义Stream

public interface TestRepository extends ElasticsearchRepository<Transaction, String> {
    Stream<Transaction> findScrollAll();
}

ElasticsearchTemplate. searchScrollStart()然后使用and实现该方法ElasticsearchTemplate. searchScrollContinue()

加法

第三种选择:

只需定义一个方法

Stream<Searchhit<Transaction>> searchBy()

在你的Testrepository. 或者只有返回类型Stream<Transaction>


推荐阅读