如何使用 ElasticSearchRequest 的 searchAfter 查询参数确定下一页是否存在

How to determine if next page exists with searchAfter query param of ElasticSearchRequest

  1. 我们在 UI 上有一个加载更多按钮,用于请求下一页。我们使用 SearchAfter 查询参数来实现 ES 分页

  2. 我正在使用 ElasticSearch 响应中的 sortValues 生成 nextPageToken。

  3. 我发现了一个场景,即使下一页不存在,我也在 E​​lastic 搜索响应中获取排序值,当我使用该排序值查询 ES 时,它 returns 为空响应.

  4. 我应该怎么做才能避免这种情况?能否提前判断是否存在下一页?

  5. 我想到的另一件事是我们是否可以假设如果 ES 响应大小小于请求的大小意味着我们没有任何新页面?

//SearchRequest代码片段

final SearchSourceBuilder sourceBuilder = new SearchSourceBuilder()
                .query(query)
                .fetchSource(getSessionsQuery.getColumns().toArray(String[]::new), null)
                .size(getSessionsQuery.getResultSize())
                .sort(new FieldSortBuilder(route.getTechnologyConfiguration().get(TIMESTAMP_FIELD_KEY)).order(SortOrder.ASC))
                .sort(new FieldSortBuilder(route.getTechnologyConfiguration().get(VERSION_SORT_KEY)).order(SortOrder.DESC));

        if (!StringUtils.isNullOrEmpty(getSessionsQuery.getNextToken())) {
            final String[] tokens = getSessionsQuery.getNextToken().split(ES_SORT_FIELD_DELIMITER);
            if (tokens.length > 0) {
                sourceBuilder.searchAfter(tokens);
            }
        }

        return new SearchRequest().indices(route.getTechnologyConfiguration().get(INDEX_KEY)).source(sourceBuilder); 

//生成下一页令牌的代码片段

 if (hits[hits.length - 1].getSortValues().length > 0) {
                    final String esSortFieldToken = Joiner.on(ES_SORT_FIELD_DELIMITER).join(hits[hits.length - 1].getSortValues());
                    nextPageToken = Joiner.on(NEXT_PAGE_TOKEN_DELIMITER).join(route.getRouteName(), esSortFieldToken);
                }

是的,当您的回击次数少于 size(或零)时,您可以假设没有更多页面。