代码之家  ›  专栏  ›  技术社区  ›  JD Isaacks

受欢迎程度,如何使新点击比旧点击更重要?

  •  4
  • JD Isaacks  · 技术社区  · 15 年前

    每种产品A 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
    

    这是可行的,但老板注意到许多老产品最先出现。所以他基本上希望新的视图比旧的视图有更大的权重。

    他的建议是,对一岁以上的孩子的任何看法都不算数。我想我必须对每一个观点都保持一个日期才能做到这一点,我认为这会降低性能。

    创建一个流行算法的最佳方法是什么,就像我老板要求的那样?

    理想情况下,我希望能够想出一些不会改变表结构的方法。如果这是不可能的,我至少想提出一个解决方案,可以使用现有的数据,这样我们就不会从0开始。如果这两者都不可能的话。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Steve Jessop    15 年前

    你不必(像这样)保留每一个视图的日期。您可以在一个包含列的表中最多保留366行:product_id,day_of_year,count。每天运行一个任务,将一年前的所有计数归零。如果您不介意非规范化的数据,那么该任务还可以更新项目本身中的“计数”字段,以便快速检索,这样您的查询就不需要更改。 product_views 就变成了 product_views_in_the_last_year . 一天的时间段是任意的-我怀疑你在乎的是人气是建立在一个精确的1年的窗口上,所以我希望它也可以是一个小时,一周或两周,这取决于你愿意处理多少桶。

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

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

        2
  •  1
  •   Nick Johnson    15 年前

    你可能想退房 this blog post . 它的目标是应用程序引擎,但这项技术是通用的。最基本的方法是让人气指数级下降,并且在记录投票/下载/任何东西时都会增加。

    推荐文章