计算在 Google App Engine 数据存储区中计算分数和日期的索引

Posted

技术标签:

【中文标题】计算在 Google App Engine 数据存储区中计算分数和日期的索引【英文标题】:Computing an index that accounts for score and date within Google App Engine Datastore 【发布时间】:2015-07-17 14:11:21 【问题描述】:

我正在开发一个基于 Google App Engine (python) 的网站,该网站允许用户生成内容,并对这些内容进行投票(喜欢/不喜欢)。

我们的设计师模糊地指定首页应该是最近内容和流行内容之间的平衡,可能假设这些只是创建一个得分值,衡量喜欢/不喜欢与时间的关系 -创建。最终,目标是 (1) 快速过滤掉不良内容,(2) 继续流行的内容保持更长时间,以及 (3) 新内容有机会保持足够长的时间以获得足够的选票,以确定它是否好与坏。

我可以根据喜欢/不喜欢轻松计算分数。但是结合时间因素来产生一个可以索引的单一分数似乎并不可行。我基本上需要每天重新索引所有内容以调整其分数,一旦我们拥有大量内容,这似乎成本过高。所以,我对潜在的解决方案不知所措。

我还建议了一些时间框(所有时间、每天、每周),但他说用户不太可能查看默认视图以外的选项卡。另外,如果我根据上周进行过滤,我需要按时排序,然后二次流行度排序基本上没有意义,因为提交时间几乎是唯一的。

关于我可能忽略的解决方案的任何建议?

Google 的 Prediction API 或 BigQuery 之类的东西能更好地处理这个问题吗?

【问题讨论】:

【参考方案1】:

这样的系统通常被称为“频率”,有很多方法可以做到这一点。一种方法是让选票随时间“衰减”;我过去在 App Engine 上通过存储当前分数和最后更新来实现这一点;任何投票都会根据上次更新时间对分数进行指数衰减,然后再存储两者,并且后台进程每天运行几次以更新一段时间内未收到投票的任何帖子的分数和衰减时间.因此,一个帖子的得分总是趋向于 0,除非它持续获得点赞。

另一个更简单的系统是对帖子进行序列号。每当有人对帖子进行投票时,请增加其数量。因此,自然排序是按创建顺序排列的,但投票有助于“重新洗牌”,将更多点赞的帖子放在更新但投票较少的帖子之前。

【讨论】:

所以,为了扩展第二个选项,基本上,我们有一个用于对内容进行排序的日期时间属性,并且该属性会针对新内容进行更新,并且任何时候有人对内容进行投票?还是您提出的建议稍微复杂一些? @ClintDoriot 不,它需要是一个计数器。发布的第一篇文章得分为 1,第二篇得分为 2,依此类推。当有人点赞帖子时,增加其得分,并按得分排序以显示。 啊,我明白了。我们甚至可以对增量进行加权,以更快(得分+2)或更慢(得分+0.5)将投票内容推上列表。 方法#1 的这种变化如何:根据日期时间属性降序排序,但根据投票修改该日期。根据原始创建日期,以指数方式减少投票添加到该日期的金额。这样就不需要后台任务定期更新旧版本了吗? @ClintDoriot 问题在于它增加了对帖子频率的显式依赖 - 您需要不断调整它以根据当前流量水平平衡赞成或反对的价值.

以上是关于计算在 Google App Engine 数据存储区中计算分数和日期的索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Google App Engine 中计算多对多关系的双方

Google App Engine RPC 服务

连接到 Google App Engine 数据存储

在 Google App Engine 上使用 Python 计算城市之间的距离并根据 GeoPT 查找周边城市

Google App Engine DataStore 文本 UTF-8 编码问题

探索Google App Engine背后的奥秘- 总结