1 需求背景

  1. 我需要对一个车系下的口碑的分数取平均分和参与人数,并且一个人可以对一个车系发布多个口碑.
  2. 需要统计多个车系的平均分与口碑数量

2 分析

典型的聚合操作.类似 mysqlgroup by 语句来获取平均值与总数.

solr 里面需要使用 Stats Component 实现.

3 Stats Component Parameters

支持的一些参数:

parameters description
stats true 调用 stats 分析
stats.field 指定分析的字段, 会列出总数/平均值/最大值等聚合操作的结果
stats.facet 对指定字段进行子分析
stats.calcdistinct 单独计数,对 stats.field 指定的字段的不重复的项进行计算,默认是关闭的

其他参数见官方文档1

4 应用

4.1 一个车系下的统计

对于第一个需求,一个车系下的平均分,需要一个车系的 id ,然后取平均分与对 user_iddistinct 值.

reputation_score 指的是口碑分数, 通过 Local Parameters 的形式取口碑平均值.后面是对 user_id 去重取总数, 即参与人数.

stats=true&stats.field={!mean=true}reputation_score&stats.field={!countDistinct=true}user_id

结果:

"stats": {
 "stats_fields": {
   "reputation_score": {
     "mean": 5.0
   },
   "user_id": {
     "countDistinct": 2
   }
  }
}

4.2 多个车系统计

对于详情页, 就只有一个车系, 自然能统计出来. 而对于多个车系, 要怎么统计每个车系下的口碑平均分和口碑总数呢?

这就用到了 stats.facet 参数.

stats=true&stats.field={!mean=true}reputation_score&stats.field={!count=true}bbs_id&stats.facet=car_series_id

结果:

"stats": {
 "stats_fields": {
   "reputation_score": {
     "mean": 5.0,
     "facets": {
       "car_series_id": {
         "286": {
           "mean": 5.0 // 平均分
         }
         "291": {
           "mean": 3.0 // 平均分
         }
       }
     }
   },
   "bbs_id": {
     "count": 6,
     "facets": {
       "car_series_id": {
         "286": {
           "count": 6 // 口碑数
         }
         "291": {
           "count": 4 // 口碑数
         }
       }
     }
   }
 }
}
Last Updated 2017-04-13 四 15:00.
Render by hexo-renderer-org with Emacs 25.3.1 (Org mode 9.1.1)