如何构建具有聚合和平面类型的新闻提要?

How to build a news feed with aggregate and flat types?

Facebook 上的一个简单功能是显示来自您朋友的 post 内容,以及您朋友分享的 post 内容。在共享 post 的情况下,它的标题为 "Kelly and 4 others" 共享 XYZ post。此外,如果您的几个朋友分享了 post,Facebook 会将他们汇总并只向您显示一次 post,它不会多次显示。 Facebook 似乎在同一个时间轴视图中显示平面提要和聚合提要。

我想要一种供提要在用户的时间轴(平面提要)中显示聚合和固定提要类型的方法。我有以下提要设置:

时间轴提要(平面)

用户供稿(扁平化)

每次用户 A 关注用户 B 时,我都会调用 getstream 来更新用户 A 的时间线供稿以关注用户 B 的用户供稿。

除了上述之外,我还想做的是将此作为示例时间线展示给用户:

持平Post 1(来自关注用户A)

Flat Post 2(来自关注用户 B)

汇总 Post 1(您关注的 4 人分享了一个 post X)

持平Post 3(来自关注用户A)

持平Post 4(来自关注用户C)

汇总 Post 2(您关注的 3 人喜欢 post Y)

现在看来,我必须从 getstream 中获取时间线提要中的活动,然后再获取聚合提要,并以某种方式在我们的后端混合这两者?

您可以通过使用单个聚合提要并调整聚合规则来实现此目的。在您的情况下,您似乎需要的是:

  • 将相同 post 的股票组合在一起
  • 在单一活动中保持 posts
  • 将相同 post 的赞组合在一起

像下面这样的聚合规则应该有效(未测试):

{% if verb.infinitive == 'like' %}
    "likes"-{{ object }}
{% elif verb.infinitive == 'share' %}
    "share"-{{ object }}
{% elif verb.infinitive == 'post' %}
    "post"-{{ object }}
{% else %}
    {{ actor }}-{{ verb.infinitive }}-{{ time.strftime('%H') }}
{% endif %}

快速解释这项工作的到期时间。聚合规则用于确定活动如何组合在一起。您可以将它们视为使用 activity 作为参数执行的函数。实际上,聚合规则类似于输出字符串的 Jinja2 模板。

如果两个活动的输出相同,则它们将属于同一个聚合 activity。

例如:活动 Tom likes post "xyz"James likes post "xyz" 都将输出 likes-xyz,因此将被组合在一起。另一方面,activity Sam posts "xyz" 将输出 post-xyz 并假设只有一个 post 称为 xyz,它永远不会与其他活动分组。

我的建议是将一些示例数据发送到提要并使用 Stream 仪表板中提供的预览功能调整聚合规则。