代码之家  ›  专栏  ›  技术社区  ›  Anna

Spring数据ElasticSearch:结果窗口太大(index.max_result_window)

  •  0
  • Anna  · 技术社区  · 6 年前

    我们从ElasticSearch2.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 回复  |  直到 6 年前
        1
  •  1
  •   Raniere    6 年前

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