新闻提要:我们为什么这样做做错了?

您好,我叫德米特里·卡洛夫斯基,有消息给您。 好吧,作为新闻,我们以另一篇文章的形式重新审视了平常的事物。 您很可能会从任何新闻提要中找到它。 否则,如果新闻发布时间不正确,您将一无所获。 不管这篇文章对您有多有趣。


典型新闻源


问题是磁带的形成方式以及用户与磁带的交互方式。 不幸的是,这里像往常一样,最简单的解决方案是极其错误的。 让我们看看为什么。


消费方式


假设某个用户要求我们提供一些实体的列表。 用户如何查看这些实体取决于他的目标。 有两种消费方式:


  1. 主动搜索。 用户正在寻找特定的东西。 他使用过滤和排序来缩小输出范围,然后顺序扫描材料,并检查每个材料。 重要的是,您要查看的列表在查看过程中不要更改,否则您可以轻松跳过要查找的内容。


  2. 被动搜索。 用户不需要任何特定内容。 相反,他希望服务查看该服务所具有的内容,并向用户显示他会感兴趣的内容。 在这里,向用户显示与特定用户最相关的材料非常重要。 他已经看到的完全不显示。



因此,新闻提要仅用于被动消费这些新闻。 是的,用户可以借助过滤器来限制兴趣范围,但是他并没有在寻找任何特定的新闻,因为他很可能还不知道它,因此进入了提要以了解它。 他的满意程度取决于他看到了多少有趣(相关)的材料以及他看到了多少无趣的材料。


相关标准


许多因素都会影响相关性。 例如,在任务管理器中更改分配给您的任务的优先级是非常重要的消息,应尽快向用户显示。 即使在那之后,还有许多其他任务的评论。


但是有一些通用标准,例如:


  1. 能见度。 如果用户已经看过此新闻并且以某种方式对其做出了反应(滚动,删除,标记为已读,转到详细信息等),则第二次他不想看到它。
  2. 相关性。 随着有关同一主题的最新新闻的出现,一些新闻失去了意义。 例如,从有关任务状态更改的新闻中,只有最新的一个有趣,反映了当前状态。
  3. 日期 新消息通常更有趣。 而且一些旧消息不再那么有趣了,最好不要显示它(例如,有一天前热水被关闭的消息)。

野生动物中的磁带


在大多数情况下,新闻提要是通过发布按其创建,发布或更改日期排序的材料来形成的。 即,根本不考虑其余的(更重要的)相关性标准。 最终,这导致用户不满意。 一些例子说明:


VKontakte饲料


用户第一次打开新闻并按顺序查看它们-一切都很好。 一段时间后,顶部会出现一条通知,指出最近有一些新闻出现。 然后他有一个棘手的选择:


  1. 继续浏览提要
  2. 将提要倒带到开头以查看最新新闻(这不是更相关的事实)。

由于磁带是准无限的,并且浏览器选项卡不能永远存在,并且没有人取消好奇心。 迟早,用户将再次处于磁带的“开始”位置。 好的,向下滚动。 没什么好麻烦的,当用户已经看到的消息突然开始继续时。 同样,用户并不是一个棘手的选择:


  1. 快速,迅速地结束录像带,减少管道中的Internet流量,希望结束他尚未见过的消息。
  2. 用磁带驱动器并执行其他操作。

事实证明,每当用户没有收到任何新闻时,他就永远不会看到它们。 但是他们可能对他很有趣。 此外,他们可能很重要,并从根本上改变了他的生活。


这个问题是如此典型,以至于给它一个特殊的名字是正确的。 让它成为“零碎意识综合症”。


哈布拉


分页会加剧此处的SFO。 在页面之间切换时,用户会看到前一页的新闻。 而且,如果他在某个页面上停留的时间更长一点,那么他很容易连续获得几页的“屠杀”。 我在有关Pajinization注释中更详细地描述了此问题。


优酷


在“推荐”中,只需给出18个经常令人恐惧的视频即可。 要查看建议中的新内容,您需要手动删除所有不会引起关注的内容。 当然,很少有用户会这样做。 在“订阅”中,它们只是按日期排序,因此用户永远不会看到旧的但可能对用户感兴趣的片段。 除非它在“推荐”中偶然发现它们。


问题的根源


当用户第一次打开提要时,他只有一个接收新闻的点-在上一次查看之后。 他低头看他们,突然出现第二个入口-上方。 而且很难说新闻在哪里更相关。 休息一会后,他返回时,至少要获得两点:录像带的开头和上一次看完新闻的地方。 并且由于私下地用户没有机会在之前观看之前观看新闻,因此新闻的这些接收点正在成倍增加。


解决方案


相关新闻的接收点应该只有一个。 同时,应该实时接收最相关的新闻。 在所有新闻中,可以区分以下几组:


  1. 可见的。 我们之前为他收集的新闻现在已经显示在屏幕上了。
  2. 已查看。 用户已经观看并滚动的新闻。 当新闻离开可见区域时,您可以安全地将其标记为已读。
  3. 故事。 为特定用户生成的新闻列表。 这既包括用户已经查看的新闻,也包括他现在正在查看的新闻。

新闻组


理想情况下,即使重新加载页面也不应更改新闻列表中的任何内容。 当用户请求更多新闻时(通过单击按钮或向下滚动),我们现在选择最相关的新闻的另一部分并将其放入故事中。 因此,用户清楚地认为磁带是有趣的东西,并且没有改变。 他所见过的一切都是按照他看到的顺序进行的。 摇摇欲坠,他不断得到一些有趣的东西,而不必担心会错过什么。 没错,如果有很多新闻,可能需要长时间绕线。


相关性


当然,最简单的事情就是简单地考虑最新新闻。 但是您可以让用户帮助服务了解他感兴趣的内容和不感兴趣的内容。 您可以通过添加删除新闻的功能来做到这一点。 如果用户不只是滚动新闻,而是删除新闻以使新闻不会阻塞他的故事,那么这种新闻对他来说就不那么有趣了,这些信息可用于后续的编辑。


API


由于我们的历史是从末尾开始补充和查看的,因此我们不能使用传统的分页,因为新闻将不断在页面之间跳转。 另外,为DBMS请求大约100500页可能太重了。 因此,对于数据采样,我们将使用锚点。 为此,我们将在请求中指出以下数据:


  1. 锚点 新闻的标识符,应从中开始返回数据。 如果未指定锚,则将最后读取的新闻作为锚。
  2. 偏移量。 要采样的新闻数量。 该数字可以为正,然后新闻在锚点之后返回。 否定,然后新闻返回锚点。

如果偏差为负,但锚点之前没有必要的新闻数量,则仅返回多少。 通过请求的数量和访问者数量的差异,客户可以了解我们正处在故事的开始。


如果偏见为正,并且主播之后没有必要的新闻数量,则将故事与当前最相关的新闻一起补充到所需的数量。 如果新闻完全结束了,那么,我们又返回多少,客户端将检测到磁带的结尾。


查询脚本


我们打开磁带,我们还没有锚点:


GET /feed?offset=5 

我们要求未读新闻:


 SELECT FROM history WHERE user = 123 AND read_at NOT NULL ORDER BY id ASC limit 5 

用户看到上次停止阅读的未读新闻的选择:


 [ { id : 3232 } , { id : 5343 } , { id : 7346 } , { id : 9825 } , { id : 9967 } ] 

用户向上摆动以查看上次看到的新闻:


 GET /feed?anchor=3232&offset=-5 

 SELECT FROM history WHERE user = 123 AND id < 3232 ORDER BY id DESC limit 5 

 [ { id : 323 } , { id : 329 } , { id : 544 } , { id : 843 } , { id : 898 } ] 

用户摇摇欲坠以查看新内容:


 GET /feed?anchor=7346&offset=5 

 SELECT FROM history WHERE user = 123 AND id > 7346 ORDER BY id ASC limit 5 

如果您收到一点新闻,我们将选择历史中缺少的必要数量的最相关新闻,然后将它们添加到历史中,然后我们将所有信息一起返回:


 [ { id : 38574} , { id : 47246} , { id : 52378} , { id : 69238} , { id : 73294} ] 

野生动物的认识


如果您知道以这种或类似方式实现提要的任何服务,我将很高兴在此处发布指向它们的链接,以便读者可以欣赏这种方法的便利。

Source: https://habr.com/ru/post/zh-CN416555/


All Articles