如何在Solr中合并facet与多stats查询结果?
解决方案
一、合并三类查询结果集
方法1:客户端多请求后合并(简单直接)
先分别执行三个查询,拿到各自结果后,以game_id为键整合数据:
提取各查询核心数据
- 从facet pivot查询结果中,统计每个
game_id下的唯一user_id数量,即为该游戏的总唯一游玩次数。 - 从play_time的stats查询结果中,提取每个
game_id对应的avg值,作为平均游玩时长。 - 从completion_rate的stats查询结果中,提取每个
game_id对应的avg值,作为平均完成率。
- 从facet pivot查询结果中,统计每个
代码示例(Python)
# 模拟从Solr返回的提取后数据 unique_plays = {"game_001": 156, "game_002": 98} avg_playtime = {"game_001": 42.5, "game_002": 31.7} avg_completion = {"game_001": 62.3, "game_002": 48.9} # 合并结果 merged_stats = {} for game_id in unique_plays: merged_stats[game_id] = { "total_unique_plays": unique_plays[game_id], "avg_play_time": avg_playtime.get(game_id, 0.0), "avg_completion_rate": avg_completion.get(game_id, 0.0) } # 输出合并后的数据 print(merged_stats)
方法2:Solr单请求多组件查询(减少HTTP请求)
把三个查询逻辑合并到一个Solr请求中,同时返回facet pivot和stats结果,再在客户端解析合并:
Solr请求参数:
q=*:*&fq=country:USA&facet=true&facet.pivot=game_id,user_id&stats=true&stats.facet=game_id&stats.field=play_time&stats.field=completion_rate
该请求会同时返回:
facet_pivot字段:game_id与user_id的层级聚合结果stats字段:play_time和completion_rate按game_id分组的统计值
客户端只需解析这两部分数据,再按game_id整合即可。
二、扩展添加更多同类查询
1. 添加新统计指标
如果需要新增总游玩时长、完成率中位数这类指标,直接在stats组件中追加配置:
- 总游玩时长:利用stats默认返回的
sum值,无需额外参数 - 完成率中位数:添加
stats.func=median(completion_rate)(Solr 6.0+支持) - 95分位游玩时长:添加
stats.func=percentile(play_time,95)
示例扩展请求:
q=*:*&fq=country:USA&facet=true&facet.pivot=game_id,user_id&stats=true&stats.facet=game_id&stats.field=play_time&stats.field=completion_rate&stats.func=median(completion_rate)&stats.func=percentile(play_time,95)
2. 添加新聚合维度
如需按平台(platform)等更多维度聚合,调整facet或stats的维度配置:
- 扩展facet pivot:
facet.pivot=game_id,platform,user_id - 扩展stats分组:
stats.facet=game_id,platform
3. 添加过滤条件
如需缩小统计范围(如只统计游玩时长超60秒的会话),在fq中追加规则:
fq=country:USA&fq=play_time:[60 TO *]
4. 复杂自定义聚合
如需按时间段分组这类复杂逻辑,可使用Solr的Streaming Expressions或Analytics Component,例如按天统计各游戏指标:
select( search(collection, q="country:USA", fl="game_id,play_time,completion_rate,event_date"), group(game_id, event_date), avg(play_time) as avg_play_time, avg(completion_rate) as avg_completion_rate, count(distinct(user_id)) as total_unique_plays )
内容的提问来源于stack exchange,提问作者Pit Digger
相关产品推荐
相关产品推荐

