如何通过Solr的cursorMark判断分页查询是否到达最后一页
Solr游标分页适配Google AIP规范的无状态实现方案
不需要服务端保存分页状态,也不需要发起额外探测请求,仅通过单次Solr请求的入参和返回值即可完成是否为最后一页的判断,逻辑如下:
- 固定分页查询时传给Solr的
rows参数为单页容量,比如单页返回20条则固定传rows=20 - 拿到Solr响应后做两层判断,满足任意一条即可判定为最后一页,按AIP规范返回空字符串作为下一页标识:
- 当前页实际返回的文档数量小于请求时传入的
rows值 - 当前页实际返回的文档数量等于
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
相关产品推荐
相关产品推荐

