从数据库中选择最受欢迎的地点的算法

4
我们有一个包含地点数据库的网站。对于每个地点,我们的用户可以执行以下操作之一,我们会记录下来:
  1. 查看 - 查看其资料
  2. 评分 - 在1-5星级评分中进行评分
  3. 评论 - 评论它
  4. 完成 - 标记他们已经去过那里
  5. 愿望清单 - 标记他们想去那里
  6. 收藏 - 标记它是他们最喜欢的之一
在我们的地点数据库表中,每个地点都包含了以上每个操作被执行的次数,以及用户给出的平均评分。
  • 查看数
  • 评分数
  • 平均评分
  • 完成数
  • 愿望清单数
  • 收藏数
我们希望能够使用上述信息生成顶级地点列表。理想情况下,我们希望能够使用相对简单的SQL查询来生成此列表,而不需要做任何额外的工作来计算其他字段或将地点堆叠排名。也就是说,由于我们只有大约50,000个地点,如果在整体结果中产生有意义的差异,我们可以运行每夜的cron作业来计算某些领域的排名等字段。
我希望您能就如何将最佳地点排在前列提出一些建议,我们应该更加重视哪些标准,并根据这些信息建议MySQL查询需要看起来像什么才能选择前10个地点。
需要注意的一点是,目前我们不太关心地点受欢迎的时间 - 这意味着查看聚合信息是可以的,并且不需要更加重视最近的数据。
感谢您提前的帮助和建议!

没有人能告诉你如何做 -- 这是一个决定,它决定了排名。为什么不选择一些东西,并不断完善,直到你满意为止呢?例如,为什么不严格按照评分来排名呢? - WhirlWind
2
@WhirlWind - 我明白最终决定将由我们做出,但我希望能够得到一些高层次的想法和外部观点,了解其他人认为哪些标准应该被更高地评价以及背后的原因。此外,我知道有些人对这类问题进行了深入思考,并且会珍视他们对适当解决方案的意见。 - Russell C.
3个回答

12
使用Wilson置信区间的下限来计算伯努利参数!(链接)

该死...+1,这非常非常有趣。 - Ben
@Paul - 我喜欢这个建议,非常有趣的阅读。你有没有想过如何将其翻译成MySQL查询或一些Perl代码?此外,您是否曾经使用过它并取得了成功?感谢您提供的好建议! - Russell C.

3
确切的“favorite”公式需要您提供,我们将称之为f(x)。
对于实际实现,我会添加一个popularity_score字段,并使用每行的f(x)来计算,就像您说的那样,使用夜间cron作业。

然后只需执行“select place name from table order by popularity_score desc”即可。

好的-让我们试试 popularity_score =(FAVORITE * 3 + COMPLETED * 2 + WISHLIST)* RATING * VIEW / AVG_VIEWS_OF_ALL_PROFILES


@Romain - 我希望能够更具体地了解f(x)可能会是什么样子。你有什么想法吗?我有我的想法,但我也很想听听外部的观点。 - Russell C.
@Russell C - 我试着做了一下 - Romain Hippeau
@Roman - 谢谢!我很想更好地理解你选择某些权重的逻辑等。此外,您认为这与在每个维度上对所有内容进行堆栈排名并计算每个位置在所有类别中的平均排名相比如何?这是我们一直在玩弄的一个想法。一种方法的优缺点与另一种方法相比如何?再次感谢! - Russell C.
@Russell C. 如果这是你最喜欢的地方,那么你可能花时间去了解它,并且它是你去过的所有地方中最喜欢的一个(排名第3)。如果你去过那里,那么它足够重要,值得你去那里。(排名第2)。如果它在你的愿望清单上,那么它对你来说还不够重要,你还没有去过。(排名第1)。 - Romain Hippeau
@Roman - 感谢您的解释。我稍微调整了算法,但总体上看起来运行良好。再次感谢您的建议。 - Russell C.
@Russell C. 你也许可以像timdev所说的那样动态地完成一些事情,从而消除了cron作业的要求。也许可以在条件表上设置触发器来实时更新popularity_score? - Romain Hippeau

1

我对如何权衡事情没有意见。

话虽如此,为什么不在位置表中添加一个受欢迎程度列呢?这样一来,你的SQL查询就变得非常简单了。

当然,棘手的部分是找出如何以及何时更新该值。但由于您保存了所有活动数据,因此您始终可以从日志条目重新生成受欢迎度值。

这样,您就可以获得“最受欢迎”的位置的快速查询,如果您想更改计算受欢迎度的方式,可以随意这样做。

如果您聪明的话,您可能能够设计出足够简单的公式,以便可以实时跟踪受欢迎程度。例如,如果我们只关心平均评分,您可以使用三个变量修改平均评分:当前平均评分、对象被评分的次数和新的评分值。

当然,当您开始混合对象已被查看、重新查看、收藏等次数时,情况会变得更加复杂...但您可能会发现,您可以设计出一种计算成本足够低廉的方法,以便您可以在几乎每个操作上更新整体受欢迎度值。


@Timdev - 我也是这样想的。我希望能够更具体地了解它看起来会是什么样子。有什么想法吗? - Russell C.

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