如何用Solr Streaming Expression实现按类别+周维度聚合浏览量
问题描述
我在Solr中存储了以下文档:
{ "category": "1", "views": 100, "created_at": "2022-08-23T07:43:25.567Z" }, { "category": "2", "views": 300, "created_at": "2022-08-23T09:43:25.567Z" }, { "category": "1", "views": 400, "created_at": "2022-08-22T08:43:25.567Z" }, { "category": "1", "views": 600, "created_at": "2022-08-16T08:43:25.567Z" }
我希望通过Streaming Expressions实现:按类别分组,同时将created_at按每周一作为周起始进行时间分组,统计每个类别每周的总浏览量。预期输出结果如下:
{ "1": { "2022-08-22T00:00:00": 500, "2022-08-15T00:00:00": 600 }, "2": { "2022-08-22T00:00:00": 300 } }
简言之,需要同时按普通字段category和以周一为起始的时间戳created_at进行聚合,请问该如何实现?
解决方案
你可以使用Solr的rollup结合timeBucket函数来实现这个需求,具体的Streaming Expression如下:
rollup( search( your_collection_name, q="*:*", fl="category,views,created_at", sort="created_at asc" ), group="category", aggregations=[ rollup( group="timeBucket(created_at, 'week', '2022-01-03T00:00:00Z')", aggregations=[sum(views)] ) ] )
关键部分解释:
- 外层
rollup:先按category字段做第一层分组,把相同类别的文档归为一组。 - 内层
rollup:在每个类别组内,使用timeBucket函数对created_at进行周维度的分组:timeBucket的第二个参数'week'指定按周聚合;- 第三个参数
'2022-01-03T00:00:00Z'是一个周一的时间点,用来强制周起始为周一(Solr默认周起始是周日,传入周一基准时间可覆盖默认规则)。
sum(views):对每个时间桶内的views字段求和,得到该类别该周的总浏览量。
注意事项:
- 替换表达式中的
your_collection_name为你实际的Solr集合名称。 - 确保
created_at字段在Solr Schema中被定义为date类型,否则timeBucket函数无法正常工作。
内容的提问来源于stack exchange,提问作者user3738870
相关产品推荐
相关产品推荐

