You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Solr的cursorMark判断分页查询是否到达最后一页

Solr游标分页适配Google AIP规范的无状态实现方案

不需要服务端保存分页状态,也不需要发起额外探测请求,仅通过单次Solr请求的入参和返回值即可完成是否为最后一页的判断,逻辑如下:

  • 固定分页查询时传给Solr的rows参数为单页容量,比如单页返回20条则固定传rows=20
  • 拿到Solr响应后做两层判断,满足任意一条即可判定为最后一页,按AIP规范返回空字符串作为下一页标识:
    1. 当前页实际返回的文档数量小于请求时传入的rows值
    2. 当前页实际返回的文档数量等于rows值,但Solr返回的nextCursorMark与本次请求传入的cursorMark完全相同
  • 不满足以上两个条件时,直接将Solr返回的nextCursorMark作为下一页标识返回即可

逻辑说明:Solr游标遍历的规则是,只要还有未返回的剩余结果,返回的nextCursorMark一定会和当前请求的cursorMark不同;当剩余结果数小于rows值时,当前页就是最后一页;当剩余结果数刚好等于rows值时,Solr返回的nextCursorMark会和当前传入值保持一致,不会生成新的游标。

参考实现伪代码:

// 入参:用户请求携带的cursorMark,为空时传Solr默认初始游标"*"
public PageResult query(String requestCursor, Integer pageSize) {
    SolrQuery query = new SolrQuery();
    query.setRequestHandler("/select");
    // 组装其他多字段检索条件
    query.setRows(pageSize);
    query.set("cursorMark", requestCursor == null ? "*" : requestCursor);
    QueryResponse resp = solrClient.query(query);
    
    String nextCursor;
    List<Doc> resultList = resp.getResults();
    String respCursor = resp.getNextCursorMark();
    // 最后一页判断
    if (resultList.size() < pageSize || respCursor.equals(requestCursor)) {
        nextCursor = "";
    } else {
        nextCursor = respCursor;
    }
    return new PageResult(resultList, nextCursor);
}

内容的提问来源于stack exchange,提问作者James Hp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:03:39