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

如何用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字段求和,得到该类别该周的总浏览量。

注意事项:

  1. 替换表达式中的your_collection_name为你实际的Solr集合名称。
  2. 确保created_at字段在Solr Schema中被定义为date类型,否则timeBucket函数无法正常工作。

内容的提问来源于stack exchange,提问作者user3738870

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 16:04:09