在我的例子中,我想过滤基于Trending的搜索结果(只基于向上的投票和时间)。
以下是一些实现"Trending排序“的网站的例子:
http://8tracks.com/explore/all
https://news.ycombinator.com/news
我看到两个选择:
1.动态计算分数(每次页面加载)
这是我目前的解决方案。每个页面加载都调用一个MySQL查询,并计算表中每一行的得分。这似乎是最准确、最实时的方法。问题是要比较的项目越多,花费的时间就越长。现在大约有120万行,需要超过3秒。在生产场景中,我的目标是< 100-300 ms。
2.安排一项任务,每X分钟运行一次,并预先计算分数
这似乎是一个很好的解决方案,但我看到的一个非常明显的问题是,您将结果存储在哪里?更新数据库中的每一行需要花费如此长的时间(我有大约120万行)。
广泛的谷歌搜索帮助我确定了使用哪种趋势算法,而不是如何在生产场景中实现它。
下面是我的数据库的一个简单示例:
table_topic
id
title
table_upvotes
topic_id
user_id
created_at下面是实际的评分算法(http://amix.dk/blog/post/19574):
exports.hackerHot = function (gravity) {
if (gravity == null) {
gravity = 1.8;
}
return function (votes, itemDate) {
var hourAge = (Date.now() - itemDate.getTime()) / (1000 * 3600);
return (votes - 1) / Math.pow(hourAge + 2, gravity);
};
};发布于 2015-07-03 23:29:41
例如,如果基于时间,"Trending“作为”在过去24小时内获得了很多选票“,如果您只计算相关行而不是整个数据库的得分,则应该会得到很好的性能提升,从而允许在运行中进行。
我所理解的唯一其他解释是一种向上投票计数,所以这也不应该花费太多的时间,所以应该也可以在飞行中做到这一点。
如果您想要更详细的答案,您必须详细说明您选择实现的确切算法。
https://stackoverflow.com/questions/31215163
复制相似问题