我们都知道发现流星的显微镜。该应用程序很好,它只与upvotes的数量一起运行。在 Best 页面中,它按升序按升序对帖子进行排序,为每个帖子存储upvote号码,并在每次用户赞成帖子时更新。
想象一下,现在我们想要实现像黑客新闻这样的东西 - 不仅是基于点击的评级,还有基于时间的评级。让我们现在定义我将使用word' click'描述用户在帖子列表中单击帖子的操作。这次点击'将此帖子的总点击次数增加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
}
然后使用rankingPosts进行渲染。这里的瓶颈是每次我必须浏览所有帖子。
第二个 - 以某种方式(我不知道如何,或者甚至可能)订阅已经得分/排序/过滤的集合,假设meteor / mongodb可以应用他们的魔法来评分/排序/过滤(并重新计算每个新小时或新点击的分数)。
现在,显而易见的问题是,你会推荐什么?
提前致谢。
答案 0 :(得分:1)
想想数字。在工作页面中,如果页面成功,您可以拥有数千个,数百万。获取所有这些只是为了找到前50名并不合理。
我建议将最终计算的评分存储在一个字段中。然后在订阅中,您应用该字段和所需限制的排序。当帖子获得新的点击时,您只需重新计算该值并将其保存到db。最后,在cron作业或流星间隔中,您更新数据库中所有项目的评级。