【问题标题】:Top-50 click&time scored posts点击和时间得分排名前 50 的帖子
【发布时间】:2014-05-08 18:45:49
【问题描述】:

我们都知道显微镜是从发现流星开始的。该应用程序很好,它仅根据赞成票的数量运行。在 Best 页面中,它按点赞数以降序对帖子进行排序,点赞数为每个帖子存储,并在每次有用户点赞帖子时更新。

想象一下,现在我们想要实现类似于黑客新闻的东西——不仅是基于点击的评级,还有基于时间的评级。现在让我们定义我将使用“点击”这个词来描述用户点击帖子列表中的帖子的操作。此“点击”使该帖子的总点击次数增加 1。

对于不知道黑客新闻算法如何工作的人,我将简要解释一下。通常某个链接(帖子)的总点击次数除以:

(T+2)^g

其中 T - 从发布时间到现在经过的总小时数,而 g 是一个“敏感度”的东西,让我们称之为,这只是一个数字、1.6 或 1.8 无关紧要。随着时间的推移,这会减少点击的影响。您可以阅读更多信息(例如,http://amix.dk/blog/post/19574)[here]

现在,我们想要前 50 个点击和时间评分的帖子,所以我们需要查询 mongo 以查找所有帖子,按分数排序,使用上面的公式计算。

我可以看到两种主要的方法,但我发现它们都很糟糕。

第一个,(我现在的方式)订阅所有帖子,在模板hepler中准备数据以供渲染

rankedPosts: function() {
  rawPosts = posts.find().map( function(item) { item.score = clicks/(T+2)^g; } ); // to add score for each post
  rawPosts = _.sortBy( rawPosts, function(item) { return item.score*(-1); }) // to sort them by calculated score
  rawPosts = _.first( rawPosts, 50 ); // to get only first 50
}

然后使用rankedPosts 进行渲染。这里的瓶颈是每次我都必须浏览所有帖子。

第二个 - 以某种方式(我不知道如何,或者是否可能)订阅已经评分/排序/过滤的集合,假设流星/mongodb 可以应用它们的魔法来评分/排序/filter(并重新计算每个新小时或新点击的分数)。

现在,很明显的问题,你会推荐什么?

提前致谢。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    想想数字。在一个工作页面中,您可以拥有数千个大多数,如果该页面成功,则可以拥有数百万个。仅仅为了找到前 50 名而获取所有这些是没有意义的。

    我建议将最终计算的评分存储在一个字段中。然后在订阅中,您按该字段和所需限制应用排序。当发布获得新点击时,您只需重新计算该值并将其保存到 db。最后,在 cron 作业或流星间隔中更新数据库中所有项目的评级。

    【讨论】:

    • 所以,一个服务器端的解决方案(除了点击重新计算),但它节省了传输到客户端的帖子数量,对吧?
    • 没错。另外,重新计算也可以在服务器端的方法中完成,客户端只会作为触发器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多