Spring-data-elasticsearch:“结果”窗口太大(index.max_result_window)

时间:2018-07-12 15:44:27

标签: spring-data-elasticsearch

我们从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个元素)...您知道为什么我们会得到这个错误吗?

1 个答案:

答案 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);
    }

此代码向您展示如何从索引中读取所有数据,您必须在滚动中获取所请求的页面。