【发布时间】: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