Spring-data-elasticsearch: 结果 window 太大 (index.max_result_window)
Spring-data-elasticsearch: Result window is too large (index.max_result_window)
我们从 Elasticsearch 2.7.0 检索信息,并允许用户查看结果。当用户请求高页码时,我们收到以下错误消息:
Result window is too large, from + size must be less than or equal to:
[10000] but was [10020]. See the scroll api for a more efficient way
to request large data sets. This limit can be set by changing the
[index.max_result_window] index level parameter
问题是我们在请求中使用了分页,所以我不明白为什么会出现此错误:
@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 个元素)...你知道我们为什么会得到这个吗?
不幸的是,Spring 数据 elasticsearch 即使分页结果在 elasticsearch 中搜索更大的结果 window。所以你有两个选择,第一个是改变这个参数的值。
第二种是使用扫描/滚动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);
}
此代码向您展示了如何从索引中读取所有数据,您必须在滚动中获取请求的页面。
我们从 Elasticsearch 2.7.0 检索信息,并允许用户查看结果。当用户请求高页码时,我们收到以下错误消息:
Result window is too large, from + size must be less than or equal to: [10000] but was [10020]. See the scroll api for a more efficient way to request large data sets. This limit can be set by changing the [index.max_result_window] index level parameter
问题是我们在请求中使用了分页,所以我不明白为什么会出现此错误:
@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 个元素)...你知道我们为什么会得到这个吗?
不幸的是,Spring 数据 elasticsearch 即使分页结果在 elasticsearch 中搜索更大的结果 window。所以你有两个选择,第一个是改变这个参数的值。
第二种是使用扫描/滚动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);
}
此代码向您展示了如何从索引中读取所有数据,您必须在滚动中获取请求的页面。