【问题标题】:How do I display random blog posts, favoring posts with high ratings?如何显示随机的博客文章,偏爱高评分的文章?
【发布时间】:2011-01-16 08:02:09
【问题描述】:

假设我有一个博客帖子表,其中有一个评级字段,用于指示帖子的质量。随机查找帖子的最有效方法是什么,更有可能返回排名靠前的帖子?

我将在 PHP、MySQL 和可能的 Lucene 中实现这一点。

【问题讨论】:

    标签: php mysql database search


    【解决方案1】:

    一个简单的解决方案是包含对RAND() 和rating 列的调用并将它们相乘:

    SELECT title, content FROM blog_posts ORDER BY (rating + 1) * RAND() DESC LIMIT 1;
    

    如果您发现这对评分较高的项目给予了过多的优先权,您可以使用SQRT:

    SELECT title, content FROM blog_posts ORDER BY SQRT(rating + 1) * RAND() DESC LIMIT 1;
    

    【讨论】:

    • 正如我在回答中所说,如果您想选择得分为 0 的帖子,您需要在 rating 上 +1。
    【解决方案2】:

    您可以使用“加权随机”排序,例如:

    SELECT title, body FROM posts ORDER BY (score+1) * RAND() DESC LIMIT 5
    

    +1 允许选择得分为 0 的帖子。 根据您帖子的平均分数,您可能需要将分数乘以另一个常数因子(例如0.5*score+1)。

    根据分数的分布情况,您可能需要转换分数,例如使用LOG(score) 或SQRT(score)。

    【讨论】:

    • 当数据库变得非常大时,此方法将如何扩展:例如10k+ 个帖子? (不是说有这么多,而是可扩展性是问题)使用 Lucene 会被证明是一种更好的方法吗?
    • 我从未使用过 Lucene,所以我无法帮助您。但是,RAND 在处理大型数据集时确实会变慢。请参阅forums.mysql.com/read.php?24,163940,163940#msg-163940 了解可能的解决方法。
    • 乘以0.5会达到什么效果?
    • @lonesomeday:实际上,我最初想添加随机分量,在这种情况下乘以 0.5 是有意义的......现在我在这种情况下考虑它不再是了。我更正了我的帖子,感谢您指出这一点。
    • 乘以 0.5,您对评分的重要性(权重)会降低。您还可以在排序中包含评分数量,以便少量评分不会对排序产生太大影响。
    【解决方案3】:

    SQL 命令:

    SELECT * FROM posts WHERE id = '$randomly_generated_ids' ORDER BY ratings ASC
    

    例如 $randomly_generated_ids 可以是“13,10,5,20”

    详细信息:ORDER BY

    【讨论】:

    • 您是随机选择,然后按评级排序。他想在选择中随机选择有利于高收视率的帖子。这里有一点不同。
    猜你喜欢
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多