You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Solr中合并facet与多stats查询结果?

解决方案

一、合并三类查询结果集

方法1:客户端多请求后合并(简单直接)

先分别执行三个查询,拿到各自结果后,以game_id为键整合数据:

  1. 提取各查询核心数据

    • 从facet pivot查询结果中,统计每个game_id下的唯一user_id数量,即为该游戏的总唯一游玩次数。
    • 从play_time的stats查询结果中,提取每个game_id对应的avg值,作为平均游玩时长。
    • 从completion_rate的stats查询结果中,提取每个game_id对应的avg值,作为平均完成率。
  2. 代码示例(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:55:16