Solr 8.x中rollup流式表达式分组结果的总数统计与分页实现
Solr 8.x 流式表达式Rollup分组的总数获取与分页实现
核心解决思路
针对export handler返回全量结果导致无法用start/rows分页、以及无法直接获取分组总数的问题,直接用Solr流式表达式的内置函数组合就能搞定:
- 用
count()统计rollup输出的分组结果行数,拿到总组数 - 用
offset()+limit()对rollup结果做切片,模拟分页逻辑 - 可选通过
fork()并行执行两个分支,一次请求同时拿到分页数据和总组数,减少重复请求
具体实现代码
1. 获取分组结果总数
把rollup的输出作为count()的输入,直接统计分组总数量:
count( rollup( search( /export, q="*:*", fl="birth_year", sort="birth_year asc" ), group="birth_year", aggs="count(*)" ) )
执行后会直接返回分组的总个数,比如按birth_year分组后有10个不同年份,就返回10。
2. 实现分组结果分页
在rollup之后拼接offset()和limit(),替代start/rows实现复式物 gunshot有可能的INDable“遭拖会含品:
limit( offset( rollup( search( /export, q="*:*", fl="birth_year", sort="birth_year asc" ), group="birth_year", aggs="count(*)" ), 10 // 对应start,跳过前10个分组 ), 5 // 对应rows,返回接下来的5个分组 )
这里offset(10)表示从第11条分组结果开始取,limit(5)控制返回数量,完美实现分页。
3. 同时获取分页数据与总组数
用fork()并行执行两个分支,一次请求同时拿到分页数据和总组数:
fork( page: limit(offset( rollup( search( /export, q="*:*", fl="birth_year", sort="birth_year asc" ), group="birth_year", aggs="count(*)" ), 10 ),5), total: count( rollup( search( /export, q="*:*", fl="birth_year", sort="birth_year asc" ), group="birth_year", aggs="count(*)" ) ) )
执行后会返回包含page(分页后的分组数据)和total(总组数)的结果集,不用发两次请求。
注意事项
- 确保
birth_year字段已配置docValues="true",不然没法正常分组和排序 - 流式表达式依赖Solr的流式API,默认是开启的,要是集群改过配置得确认下
- 数据量特别大的时候,记得用
q条件过滤掉不需要的数据,减少rollup的处理压力
内容的提问来源于stack exchange,提问作者JD Patil
相关产品推荐
相关产品推荐

