我们从Elasticsearch 2.7.0检索信息,并允许用户浏览结果。当用户请求较高的页码时,我们会收到以下错误消息:
结果窗口太大,从+大小必须小于或等于: [10000],但为[10020]。查看滚动API,了解更有效的方法 请求大数据集。可以通过更改 [index.max_result_window]索引级别参数
问题是我们在请求中使用了分页,所以我不明白为什么会收到此错误:
@Autowired
private ElasticsearchOperations elasticsearchTemplate;
...
elasticsearchTemplate.queryForPage(buildQuery(query, pageable), Document.class);
...
private NativeSearchQuery buildQuery() {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.boolQuery().must(QueryBuilders.termQuery(term, query.toUpperCase())));
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder().withIndices(DOC_INDICE_NAME)
.withTypes(indexType)
.withQuery(boolQueryBuilder)
.withPageable(pageable);
return nativeSearchQueryBuilder.build();
}
我不明白该错误,因为我们每次都回退pageable.size
(20个元素)...您知道为什么我们会得到这个错误吗?
答案 0 :(得分:1)
不幸的是,即使分页结果在Elasticsearch中搜索了更大的结果窗口,Spring数据也会进行Elasticsearch。因此,您有两个选择,第一个是更改此参数的值。
第二个是使用扫描/滚动API,但是据我了解,在这种情况下,分页是手动完成的,因为它用于无限顺序读取(例如滚动鼠标)。 样本:
List<Pessoa> allItens = new ArrayList<>();
String scrollId = elasticsearchTemplate.scan(build, 1000, false, Pessoa.class);
Page<Pessoa> page = elasticsearchTemplate.scroll(scrollId, 5000L, Pessoa.class);
while (true) {
if (!page.hasContent()) {
break;
}
allItens.addAll(page.getContent());
page = elasticsearchTemplate.scroll(scrollId, 5000L, Pessoa.class);
}
此代码向您展示如何从索引中读取所有数据,您必须在滚动中获取所请求的页面。