【问题标题】:How to prevent duplicates at algorithm-based infinite scrolling如何在基于算法的无限滚动中防止重复
【发布时间】:2021-05-20 18:40:57
【问题描述】:

这更像是一个淋浴的想法。因此,几乎所有社交媒体平台都有无限滚动。但是它们如何防止重复呢?

所以,假设您使用 ajax 获取内容。例如,当您有一个包含 50 个项目的静态列表,并且您希望每次用户到达底部时再获取 10 个结果,您可以轻松地按例如页面:

$.ajax(
   url = "mysite.api/content?page=2"
   ...
)

但是对于像 YouTube 这样的网站,您的推荐可能每秒钟都在变化,并且无法按页面对结果进行排序。例如。如果我想获取 YouTube 起始页的内容,它看起来像

$.ajax(
   url = "youtube.api/start?user=aXqq1...&page=1"
   ...
)

但是,当我进一步滚动时,YouTube 会获取另一个页面,该算法可能已经推荐了不同的视频,或者使用了其中的一些视频,因此可能会出现重复的视频。所以这不是一个选择,我真的很喜欢他们如何防止它。


我目前的想法是:

1。网络套接字:

YouTube 查询一次视频内容,然后每次滚动到底部时从预加载列表中加载更多内容。

问题:YouTube 不知道我会滚动多远。这意味着他们要么存储大量视频推荐,要么在 500 个视频之后执行新查询,这将再次导致重复问题。


2。在 ajax 请求中包含已列出的视频

每次获取新视频时,YouTube 都会将视频列表(已加载)发布回 API,以便排除这些视频。

问题:每次发出新请求时,加载时间都会变慢,因为需要交换更多数据。


这让我明白了我的出发点:他们如何(有效地)防止重复?

【问题讨论】:

    标签: ajax algorithm youtube infinite-scroll


    【解决方案1】:

    即使在分页的结果中,您也可能遇到同样的问题。我一直在网站上,当我单击第二页时,它的结果也在第一页上(StackOverflow 是一个)。我认为这是一个权衡计算效率和结果质量的决定。我发现here 的一个简单解决方案说,您可以通过保留用户开始查看时间的时间戳来完成它,然后过滤结果以排除比该时间更新的任何内容。实现起来应该相对便宜,但这意味着您需要重新加载以获得更多相关信息。如果这是执行此操作的标准方式,我不会感到惊讶,因为有多少应用程序和网站在工作流程中构建了令人耳目一新的内容。例如,刷新 reddit 很容易意外完成,而 youtube 应用程序会在您离开它几分钟然后再回来时刷新它的推荐。如果用户已经开始期望需要刷新以获得最新结果(在我看来,他们有),那么这种可以说是次优的解决方案可能是要走的路。

    【讨论】:

    • 据我所知,这篇文章适用于基于时间的无限滚动,但不适用于 YouTube 等未排序的列表。因为您将如何在 YouTube 中实现更新参数?数字每秒都在变化。 YouTube 将无法再向您显示所有视频,因为它们都已更新...
    • 我认为您的问题比您想象的要复杂一些。 Youtube 是一个庞大的组织,拥有荒谬的资源来寻找聪明的方法来做到这一点,所以特别是他们的解决方案可能不是像我们这样的人能想出来的。
    • 也就是说,我的猜测是他们实际上不需要担心重复,因为他们有太多的选择,重复的不太可能开始。如果我要在一个下午尝试实现它,我可能会尝试在客户端中保留一组最后 500 个视频,然后服务器可以确保它推荐的内容不在该集合中。如果用户滚动这么长时间,他们应该可以接受重复。
    猜你喜欢
    • 2012-02-03
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2023-04-03
    • 1970-01-01
    • 2017-05-08
    相关资源
    最近更新 更多