Spring 带 Pageable 的数据弹性搜索存储库仅重新调整 10000 个文档

Spring data elasticsearch repository with Pageable is retuning only 10000 documents

我在 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 个文档。你能帮我找出为什么会这样吗?

我看到两个选项:

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

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

乙。如果您有更大的索引 and/or 增加 index.max_result_window 限制出于任何原因都不是一个选项,那么您需要利用 Scroll API. Spring Data ES supports two ways 来做到这一点。

第一种方法涉及利用内部使用 Scroll API

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

第二种方法有点低级。您需要使用 returns a Stream:

的方法修改存储库定义
public interface TestRepository extends ElasticsearchRepository<Transaction, String> {
    Stream<Transaction> findScrollAll();
}

然后用 ElasticsearchTemplate. searchScrollStart()ElasticsearchTemplate. searchScrollContinue()

实现该方法

加法:

第三个选项:

只需定义一个方法

Stream<Searchhit<Transaction>> searchBy()

在你的 Testrepository 中。或者仅使用 return 类型 Stream<Transaction>.