如何按指定字段精确值排序Solr结果并生成bucket,且按特定bucket计数排序
刚好之前处理过类似的Solr分组统计需求,给你整理了几个精准匹配你需求的查询方案,既能按url生成bucket,还能基于每个bucket的记录数(甚至特定结果的数量)排序:
核心方案1:用分组(Grouping)实现基础bucket+排序
如果只需要把相同url的记录归为一个bucket,同时按每个bucket的总记录数排序,直接用Solr的Grouping功能就行,查询参数如下:
q=*:* &group=true &group.field=url &group.sort=count desc # 按bucket记录数降序排,换成asc就是升序 &group.limit=0 # 要是只需要统计信息不用具体记录,就设为0;要返回每个bucket的前N条记录就改对应数字
拿你的数据举例,这个查询会把/api/work2(6条记录)的bucket排在/api/helo1(5条)前面,完美符合排序要求。返回结果里每个group都会标注该bucket的总记录数numFound。
核心方案2:分组+组内结果统计(OK/KO数量)
如果还需要每个bucket里OK和KO的具体数量,就结合Stats组件一起用,查询参数如下:
q=*:* &group=true &group.field=url &group.sort=count desc &stats=true &stats.field=outcome &stats.facet=url # 按url分组统计outcome的分布
这样返回的结果里,除了每个url的分组信息,还会附带该bucket内OK、KO各自的出现次数,方便你做更细致的分析。
备选方案:用Facet Pivot做层级统计
要是你只需要统计数据,不需要返回具体的记录条目,用Facet Pivot会更简洁,还能直接按记录数排序:
q=*:* &facet=true &facet.pivot=url,outcome &facet.pivot.mincount=1 &facet.sort=count desc
这个查询会返回层级化的统计结果:先按url分bucket,每个bucket下再细分OK和KO的数量,并且整体按bucket的总记录数降序排列,结果一目了然。
几个注意点
- 确保你的
url字段在Solr Schema里是indexed="true"的,不然没法用来分组和统计。 - 如果想按bucket内的特定值排序(比如按KO的数量排序),可以调整排序参数,比如结合Stats组件用
group.sort=stats.outcome(KO) desc就行。
内容的提问来源于stack exchange,提问作者Balaban Mario
相关产品推荐
相关产品推荐

