Php 受欢迎程度,如何使新的点击率高于旧的点击率?

Php 受欢迎程度,如何使新的点击率高于旧的点击率?,php,mysql,algorithm,popularity,Php,Mysql,Algorithm,Popularity,每个产品aproduct\u date\u added,它是一个date字段,包含添加日期。 它们还有一个product\u views,这是一个int字段,其中包含产品的浏览次数 为了按受欢迎程度显示产品,我使用了一个算法来计算一个产品每天的点击率 SELECT AVG(product_views / DATEDIFF(NOW(), product_date_added)) as avg_hits , product_table.* FROM product_table W

每个产品a
product\u date\u added
,它是一个
date
字段,包含添加日期。 它们还有一个
product\u 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
这是可行的,但是老板注意到很多老产品首先出现。因此,他基本上希望新视图比旧视图具有更大的权重

他的建议是,任何超过一岁的观点都不算数。我想我必须为每个视图保留一个日期,这样做会降低性能

创建像我老板要求的那样的人气算法的最佳方法是什么?

理想情况下,我希望能够想出一些不会改变表结构的东西。如果这是不可能的,我想至少想出一个解决方案,可以使用现有的数据,所以我们不是从0开始。如果这两种方法都不可行,那么任何一种方法都是可行的。

你就不必(这样)保留每个视图的日期。相反,在一个包含以下列的表中,每个项目最多可以保留366行:product\u id、day\u of\u year、count。每天运行一个任务,将一年前的所有计数归零。如果您不介意非规范化数据,该任务还可以更新项目本身中的“计数”字段,以便快速检索,这样您的查询就不需要更改<代码>产品视图在上一年变成了
产品视图
。1天的时间段是任意的——我怀疑你是否在乎人气是基于精确1年的时间窗,所以我预计它也可能是一小时、一周或两周,取决于你愿意处理多少桶

另一种方案可能是使用指数衰减。将计数字段转换为十进制类型。每天一次,将每件物品的数量减少一个固定的百分比(小于1%,大于0.1%),这样,最近的一次点击次数越多,它的“重量”就越大。所以,过去的人气永远不会完全消失,但一年前的热门歌曲不会有多大贡献。顺便说一句,这个方案的一个等价物是保持代码不变,但要确保您的网站作为一个整体随着时间的推移变得指数级地更受欢迎;-)


至于避免从零开始-可能会立即减少每件物品的数量,作为一次性行动,减少的比例取决于物品的年龄。总的来说,您可能会认为较旧的对象具有较旧的视图,因此被当前方案高估了。这不是万无一失的,因为也许一些旧的物品最近获得了很多点击率。您可以通过查看最近的web服务器日志,或者在进行一次性减少之前花一周或一个月的时间计算点击次数来识别这些项目。即使不这样做,如果他们受欢迎的根本原因(不仅仅是因为他们目前在你的排名中排名很高,因此从查看你的“最受欢迎”图表的人那里获得流量),那么希望他们能在一定时间内恢复过来。

你可能想看看。它的目标是应用程序引擎,但技术是通用的。基本方法是使受欢迎程度呈指数衰减,并在您记录投票/下载/任何内容时增加。

我非常喜欢每天减少一小部分的想法。这样一来,在1年前就不会有一个急剧的下降,而是每天都在逐渐衰退。在你的第三段,也许我可以从减少10%的活跃年数开始。因此,一年内增加的项目将不会有任何损失,3年前的项目将损失30%。谢谢。@John:是的,我故意对数字含糊其辞,因为你可能会想尝试不同的值并查看结果,直到你得到一个大致符合你需要的图表为止。或者,如果你不知道自己想要什么,至少一张图表在你或你的老板看来不再是绝对错误的:-)我想把所有产品的平均浏览量减少一小部分(但不低于0)。