首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将搜索结果按"Trending“排序?

如何将搜索结果按"Trending“排序?
EN

Stack Overflow用户
提问于 2015-07-03 23:08:52
回答 1查看 781关注 0票数 2

在我的例子中,我想过滤基于Trending的搜索结果(只基于向上的投票和时间)。

以下是一些实现"Trending排序“的网站的例子:

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

https://news.ycombinator.com/news

https://www.reddit.com/

我看到两个选择:

1.动态计算分数(每次页面加载)

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

2.安排一项任务,每X分钟运行一次,并预先计算分数

这似乎是一个很好的解决方案,但我看到的一个非常明显的问题是,您将结果存储在哪里?更新数据库中的每一行需要花费如此长的时间(我有大约120万行)。

广泛的谷歌搜索帮助我确定了使用哪种趋势算法,而不是如何在生产场景中实现它。

下面是我的数据库的一个简单示例:

代码语言:javascript
复制
table_topic
id
title


table_upvotes
topic_id
user_id
created_at

下面是实际的评分算法(http://amix.dk/blog/post/19574):

代码语言:javascript
复制
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);
  };
};
EN

回答 1

Stack Overflow用户

发布于 2015-07-03 23:29:41

例如,如果基于时间,"Trending“作为”在过去24小时内获得了很多选票“,如果您只计算相关行而不是整个数据库的得分,则应该会得到很好的性能提升,从而允许在运行中进行。

我所理解的唯一其他解释是一种向上投票计数,所以这也不应该花费太多的时间,所以应该也可以在飞行中做到这一点。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31215163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档