受欢迎程度,如何让新的点击量比旧的更有影响力?

4
每个产品都有一个“product_date_added”字段,它是一个包含添加日期的“Date”类型字段。另外还有一个“product_views”字段,它是一个包含产品浏览次数的“int”类型字段。
为了按照受欢迎程度显示产品,我使用了一个算法来计算每天产品的点击量。
SELECT 
    AVG(product_views / DATEDIFF(NOW(), product_date_added)) as avg_hits
    , product_table.* 
FROM product_table
WHERE product_available = "yes" 
GROUP BY product_id
ORDER BY avg_hits DESC

这个方案是可行的,但老板注意到许多旧产品排名靠前。因此,他希望新视图权重比旧视图高。
他建议超过一年的任何视图都不计入权重。我认为我必须保留每个视图的日期才能做到这一点,但我认为这会降低性能。
创建像老板所要求的受欢迎度算法的最佳方法是什么?
理想情况下,我希望能够提出一些不改变表结构的东西。如果不可能,至少我希望能够提出解决方案,可以使用现有数据,这样我们就不会从零开始。如果也不可能,那么任何有效的解决方案都将起作用。

可能是流行度算法的重复问题。 - Ofri Raviv
2个回答

2
您不必保留每次查看的日期。相反,您可以在一个表中为每个项目保留366行,每行包含以下列:product_id,day_of_year和count。每天运行一次任务,将所有计数从一年前归零。如果您不介意非规范化数据,该任务还可以更新项目本身的“count”字段以实现快速检索,这样您的查询就不需要更改。`product_views`变成了`product_views_in_the_last_year`。1天的时间段是任意的-我认为您可能并不关心受欢迎程度基于精确1年窗口,因此我希望它同样适用于1小时、1周或2周,具体取决于您愿意处理多少桶。
另一种方案可能是使用指数衰减。将计数字段转换为十进制类型。每天一次,将每个项目的计数按固定百分比(小于1%,大于0.1%)减少,以便最近的点击具有更多“权重”。因此,旧的受欢迎程度永远不会完全消失,但一年前的点击不会做出太大贡献。顺便说一下,与该方案等效的是将代码保持不变,但确保您的整个网站随着时间的推移呈指数增长;-)
至于避免从零开始-也许立即减少每个项目的计数,作为一次性操作,其比例取决于项目的年龄。总体而言,您预计较旧的对象具有较旧的视图,因此当前方案评估过高。这并不是绝对可靠的,因为可能一些旧物品最近获得了大量点击。您可以通过查看最近的Web服务器日志或在进行一次性减少之前花费一周或一个月计算点击次数来识别这些项目。即使没有这样做,如果它们受欢迎的根本原因(不仅仅是因为它们当前在您的排名中排名较高,因此从查看“最受欢迎”图表的人那里获得流量),那么希望它们随着时间的推移会恢复。

我真的很喜欢每天按小百分比减少的想法。这样一来,就不会在一年前有一个突然的截止日期,而是每天都有一个逐渐衰减的过程。对于你第三段所说的,也许我可以从将活跃年限乘以10%开始减少。因此,在一年内添加的项目将不会失去任何东西,而来自3年前的项目将失去30%。谢谢。 - JD Isaacks
@John:是的,我故意模糊了数字,因为您可能希望尝试不同的值并查看结果,直到您获得大致符合要求的图表。或者,如果您不知道自己想要什么,至少可以获得一张看起来不再明显错误的图表,以便您和您的老板。 :-) - Steve Jessop
我考虑将所有产品每天的平均浏览量减少一部分(但不低于0)。 - Hugh Brackett

1

你可能想要查看这篇博客文章。它是针对App Engine的,但该技术是通用的。基本方法是拥有一个指数下降的受欢迎度,并且每次记录投票/下载/其他操作时都会增加。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接