如何按";趋势"

How to sort search results by "Trending"?

本文关键字:quot 趋势 何按      更新时间:2023-09-26

在我的情况下,我想根据趋势(仅基于支持率与时间(过滤搜索结果。

以下是一些实现"趋势排序"的网站示例:

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

https://news.ycombinator.com/news

https://www.reddit.com/

我看到的两个选项:

1.实时计算分数(每次页面加载(

这是我目前拥有的解决方案。每次页面加载都会调用MySQL查询,并为表中的每一行计算一个分数。这似乎是最准确、最实时的方法。问题是要比较的项目越多,所需时间就越长。现在大约有120万行,这需要3秒钟以上的时间。在生产场景中,我的目标是<100-300毫秒

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

如果基于时间,例如将"Trending"设置为"在过去24小时内获得了许多支持票",那么如果只计算相关行的分数,而不是整个数据库的分数,那么您应该会得到很好的性能提升,从而使其能够实时生成。

我所理解的唯一另一种解释是按赞成票计数,所以这也不应该花费太多时间,所以也应该可以在运行中做到这一点。

如果你想要更详细的答案,你必须详细说明你选择实现的确切算法。