4

我们有一个包含地点数据库的网站。对于每个地方,我们的用户都可以采取我们记录的以下操作之一:

  1. VIEW - 查看它的个人资料
  2. 评分 - 以 1-5 星的等级对其进行评分
  3. 审查 - 审查它
  4. 已完成 - 标记他们去过那里
  5. 愿望清单 - 标记他们想去那里
  6. FAVORITE - 标记这是他们的最爱之一

在我们的地点数据库表中,每个地点都包含执行上述每个操作的次数以及用户给出的平均评分。

  • 意见
  • 收视率
  • 平均评分
  • 完全的
  • 愿望清单
  • 最喜欢的

我们希望能够使用上述信息生成排名靠前的位置列表。理想情况下,我们希望能够使用相对简单的 SQL 查询来生成此列表,而无需做任何繁琐的工作来计算额外的字段或相互堆叠排名位置。话虽如此,由于我们只有大约 50,000 个位置,我们可以运行一个夜间 cron 作业来计算一些字段,例如不同类别的排名,如果它会对我们的顶级位置的整体结果产生有意义的差异。

如果你能就我们应该如何考虑将最佳位置冒泡到顶部提出一些建议,我将不胜感激,我们应该更加重视哪些标准,并鉴于这些信息 - 建议 MySQL 查询需要看起来像什么才能选择前 10 个地方。

需要注意的一点是,此时我们不太关心某个地方的流行程度——这意味着查看汇总信息就可以了,并且不需要对更新的数据进行更重的加权。

提前感谢您的帮助和建议!

4

3 回答 3

12

使用伯努利参数的威尔逊分数置信区间的下限!

于 2010-04-25T02:59:40.733 回答
3

最喜欢的确切公式需要来自您,我们将其称为 f(x)。
对于实际实现,我将添加一个我将计算的流行度得分字段,正如您在每行使用 f(x) 的每晚 cron 作业中所说的那样。

那么这只是一个简单的“从表顺序中选择地名”的例子。

好的 - 让我们给它一个 stab Popularity_score = (FAVORITE * 3 + COMPLETED * 2 + WISHLIST) * RATING * VIEW / AVG_VIEWS_OF_ALL_PROFILES

于 2010-04-25T02:59:32.387 回答
1

我对如何称量事物没有意见。

也就是说,为什么不直接在位置表中添加一个流行度列呢?突然之间,您的 SQL 查询变得异常简单。

当然,棘手的部分是弄清楚如何以及何时更新该值。但是由于您要保存所有活动数据,因此您始终可以从日志条目中重新生成流行度值。

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

如果你很聪明,你也许可以设计一个足够简单的公式,以便实时跟踪流行度。例如,如果我们只关心平均评分,您可以只使用三个变量来修改平均评分:当前平均评分、对象被评分的次数和新评分值。

当然,当您开始混合对象已被查看、评论、收藏等的次数时,事情会变得更加复杂……但您可能会发现您可以设计一种计算成本足够低的方法,您可以更新整体流行度重视几乎每一个行动。

于 2010-04-25T03:00:09.317 回答