如何通过Solr的JSON Facets获取Terms Facet的占比数据?
实现Solr Terms Facet各值的占比统计
嘿,这个需求确实直接,用Solr的JSON Facet就能轻松搞定,核心是借助全局统计的总文档数,来计算每个分桶的占比。下面是具体的实现方案:
完整查询示例
你可以发送这样的Solr查询请求(替换your_core为你的实际核心名称):
GET /solr/your_core/select?q=*:*&rows=0&json.facet={ "count": "count(*)", "myTerms": { "type": "terms", "field": "myTerm", "buckets": [ { "val": "val", "count": "count", "percent": "div(multiply(count, 100), $count)" } ] } }
关键部分解释
q=*:*:匹配所有文档,你可以根据业务需求修改为具体的查询条件(比如某些过滤条件)rows=0:不需要返回具体文档内容,只保留统计结果,提升查询效率count:"count(*)":计算当前查询匹配到的总文档数,这个值会作为全局变量$count,供后续分桶计算使用myTerms:自定义的terms facet,指定统计字段为myTerm- 分桶自定义字段:
val": "val":返回当前分桶的取值(比如"OK"或"KO")count": "count":返回当前分桶的文档数量percent": "div(multiply(count, 100), $count)":通过Solr的数学表达式计算占比——用当前分桶的文档数乘以100,再除以总文档数,得到百分比
可选优化:整数百分比
如果需要返回整数形式的百分比(比如40而非40.0),可以用floor或ceil函数对结果取整:
"percent": "floor(div(multiply(count, 100), $count))"
预期返回结果
执行上述查询后,你会得到类似这样的结果,完全符合你的需求:
{ "response": { "numFound": 100, "start": 0, "docs": [] }, "facets": { "count": 100, "myTerms": { "buckets": [ { "val": "OK", "count": 40, "percent": 40.0 }, { "val": "KO", "count": 60, "percent": 60.0 } ] } } }
内容的提问来源于stack exchange,提问作者Davide
相关产品推荐
相关产品推荐

