如何按";趋势"
How to sort search results by "Trending"?
在我的情况下,我想根据趋势(仅基于支持率与时间(过滤搜索结果。
以下是一些实现"趋势排序"的网站示例:
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小时内获得了许多支持票",那么如果只计算相关行的分数,而不是整个数据库的分数,那么您应该会得到很好的性能提升,从而使其能够实时生成。
我所理解的唯一另一种解释是按赞成票计数,所以这也不应该花费太多时间,所以也应该可以在运行中做到这一点。
如果你想要更详细的答案,你必须详细说明你选择实现的确切算法。
相关文章:
- 铬:“;未捕获的语法错误:意外的标记:"
- 可以设置“;文件名"发生错误时显示的内联脚本标记的
- JS表单提交"无法使用Chrome数据保护程序加载此页面.尝试重新加载页面.调试信息:POST CISmtuK
- 检测电话窃听,即:<a href="电话:xxx">在UIWebview上
- 使用“+="操作人员
- //而不是在src=“”上使用http://"属性
- "未捕获的语法错误:意外的标记}"
- 可以<脚本类型=“;text/javascript”>window.location=“/"</
- "实例范围”;TypeScript类的getter/setter
- Javascript复选框函数:;缺少:在属性id之后"
- "“;变量未引用正确的对象
- "日期“;AJAX请求返回的类型值未定义
- 得到"TypeError:无法读取属性'filename'未定义的“;调用“npm start
- Soundcloud api"未捕获的类型错误:无法读取属性'uri'“未定义”;
- "工具提示"jQuery插件坏了
- "锻造;React中的表达式
- 图像可以从源<img src=""/>.TEXT可以在没有javascript的情况下从外部
- 如何提取“;href"最近列表项中的属性值
- CKEditor如何允许href="javascript:void(0)"在小部件中
- 如何按";趋势"