如何按"趋势"?

时间:2015-07-03 23:08:53

标签: javascript mysql database node.js web

在我的情况下,我想基于趋势过滤搜索结果(基于upvotes与时间的关系)。

以下是一些实施"趋势排序"

的网站示例

http://8tracks.com/explore/all

https://news.ycombinator.com/news

https://www.reddit.com/

我看到两个选项:

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);
  };
};

1 个答案:

答案 0 :(得分:0)

如果基于时间,那么"趋势" as"在过去的24小时内得到了很多赞成票#34;例如,如果仅针对相关行而不是整个数据库计算得分,则应该获得良好的性能提升,从而允许它在运行中进行。

我理解的唯一其他解释是通过upvote计数,所以这不应该花费太多时间,因此也应该可以即时执行此操作。

如果您需要更详细的答案,则必须详细说明您选择实施的确切算法。