如何使用PySolr实现带子分面与聚合函数的分面求和查询
PySolr分面分组后指定字段求和聚合实现
问题背景
现有可正常返回计数结果的Solr分面查询,需求为:对按facet.field完成分组的数据,针对指定字段做sum聚合计算。
手写的JSON分面查询在浏览器直接请求Solr接口可正常返回结果,但使用PySolr调用时始终无法得到预期结果,原调用代码如下:
import pysolr import pprint conn = pysolr.Solr('http://localhost:8080/solr/corename') result = conn.search('*:*', **{ 'facet': 'true', 'facet.type': 'terms', 'facet.limit': 5, 'facet.field': 'field_name', 'f.results.facet.sum': '{!func}sum(daily_amount)' }) pprint.pprint(result.facets)
核心疑问:PySolr是否支持对分面分组后的指定字段做求和聚合?如果支持,正确的实现写法是什么?
解答
PySolr原生支持分面分组后的字段求和聚合,原代码调用失败的核心原因是JSON分面参数的传递方式、层级写法错误。
Solr的JSON Facet API要求所有自定义分面、聚合的嵌套配置统一通过json.facet参数传递,不能将嵌套配置拆分为零散的f.xxx格式参数传递,否则Solr无法识别聚合逻辑。
正确实现代码如下:
import pysolr import pprint conn = pysolr.Solr('http://localhost:8080/solr/corename') result = conn.search( '*:*', **{ 'facet': 'true', 'json.facet': ''' { "field_group": { "type": "terms", "field": "field_name", "limit": 5, "facet": { "sum_daily_amount": "sum(daily_amount)" } } } ''' } ) pprint.pprint(result.facets)
写法说明
- 所有分面聚合规则统一放在
json.facet参数中,以标准JSON结构传入,不要拆分零散参数 - JSON分面内置
sum/avg/max等常用聚合函数,不需要额外添加{!func}前缀,直接传入待聚合的字段名即可 - 返回结果中,分组及对应的求和值会挂载在
result.facets的field_group节点下,结构和浏览器直接调用Solr接口返回的结果完全一致
内容的提问来源于stack exchange,提问作者Chirdeep Tomar
相关产品推荐
相关产品推荐

