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

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