spring-boot - 具有 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 个文档。你能帮我找出为什么会这样吗?
- 弹性搜索版本:7.9
- spring-boot-starter-parent:2.3.2.RELEASE
解决方案
我看到两个选项:
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>
。
推荐阅读
- php - 如何在 `route()` 函数中添加默认的第三个参数`$absolute`?
- python - 我应该如何随机生成异常值?
- vba - 通过 ODBC 从 MariaDB 自动重新链接表 (VBA)
- laravel - 用户单击下拉列表中的选项后如何显示数据?
- ios - 初始化我的模型实例给我 <
> - python - 从 CSV 文件到 Highstock JS 错误中绘图的数据时间
- python - 如何限制在odoo的关注者中发送电子邮件?
- mysql - sql 在查询子句中使用求和结果
- python - 如何从可以变化的字符串中提取特定字符
- windows - 在批处理脚本中将文本附加到变量