基于 ElasticSearch 的search_after解决深分页问题

在Elasticsearch中进行分页查询通常使用from和size参数。当我们对Elasticsearch发起一个带有分页参数的查询(如使用from和size参数)时,ES需要遍历所有匹配的文档直到达到指定的起始点(from),然后返回从这一点开始的size个文档。

ES的检索机制决定了,当进行分页查询时,Elasticsearch需要先找到并处理所有位于当前页之前的记录。例如,如果你请求第1000页的数据,并且每页显示10条记录,系统需要先处理前9990条记录,然后才能获取到你请求的那10条记录。这意味着,随着页码的增加,数据库需要处理的数据量急剧增加,导致查询效率降低。

GET /your_index/_search
{
  "from": 20,
  "size": 10,
  "query": {
    "match_all": {}
  }
}

可以用 scroll 或者 search_after 来解决ES 的深分页问题:

image-20250408125548536

public SAPageInfo<User> deepPageQueryByState(String name, String state, int pageSize, Long lastId) {
    LambdaEsQueryWrapper<User> queryWrapper = new LambdaEsQueryWrapper<>();
    queryWrapper.match(User::getName, name)
            .and(wrapper -> wrapper
                    .match(User::getState, state))
            .orderByAsc("User_id");

    SAPageInfo<User> saPageInfo;
    if (lastId == null) {
        saPageInfo = userEsMapper.searchAfterPage(queryWrapper, null, pageSize);
    } else {
        saPageInfo = userEsMapper.searchAfterPage(queryWrapper, ImmutableList.of(lastId), 10);
    }
    return saPageInfo;
}

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部