在我的情况下,我想基于趋势过滤搜索结果(基于upvotes与时间的关系)。
以下是一些实施"趋势排序"
的网站示例http://8tracks.com/explore/all
https://news.ycombinator.com/news
我看到两个选项:
1。即时计算分数(每页加载时)
这是我目前的解决方案。每个页面加载调用MySQL查询并计算表中每一行的分数。这似乎是最准确,实时的方法。问题是需要比较的项目越多,所需的时间就越长。现在大约有1.2万行,需要3秒多。在生产场景中,我的目标是< 100-300毫秒。
2。安排任务每X分钟运行一次并预先计算分数
这似乎是一个很好的解决方案,但我看到的一个非常明显的问题是你在哪里存储结果?更新数据库中的每一行需要很长时间(我有大约1.2万行)。
广泛的谷歌搜索帮助我确定使用哪种趋势算法,而不是如何在生产场景中实现它。
这是我的数据库的一个简单示例:
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);
};
};
答案 0 :(得分:0)
如果基于时间,那么"趋势" as"在过去的24小时内得到了很多赞成票#34;例如,如果仅针对相关行而不是整个数据库计算得分,则应该获得良好的性能提升,从而允许它在运行中进行。
我理解的唯一其他解释是通过upvote计数,所以这不应该花费太多时间,因此也应该可以即时执行此操作。
如果您需要更详细的答案,则必须详细说明您选择实施的确切算法。