计算在 Google App Engine Datastore 中计算分数和日期的索引

Computing an index that accounts for score and date within Google App Engine Datastore

我正在开发一个基于 Google App Engine (python) 的站点,该站点允许用户生成内容并对该内容进行投票 (like/dislike)。

我们的设计师已经相当含糊地指定首页应该在最近的内容和流行的内容之间取得平衡,可能假设这些只是创建一个权重 likes/dislikes 与自创建以来的时间。最终,目标是 (1) 较快地过滤掉不良内容,(2) 继续流行的内容停留时间更长,以及 (3) 新内容有机会停留足够长的时间以获得足够的选票来确定其是否好与坏。

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

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

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

Google 的预测 API 或 BigQuery 能够更好地处理这个问题吗?

这样的系统通常称为 "frecency",有多种方法可以实现。一种方法是随着时间的推移获得投票 'decay';我过去在 App Engine 上通过存储当前分数和最后更新的分数实现了这一点;任何投票都会根据最后更新的时间对分数应用指数衰减,然后再存储两者,后台进程每天运行几次以更新任何 posts 的分数和衰减时间一会儿收到选票。因此,post 的分数总是趋向于 0,除非它始终获得赞成票。

另一个更简单的系统是序列号posts。每当有人投票 post 时,增加它的数量。因此,自然排序是按创建顺序进行的,但投票服务于 'reshuffle' 事物,将更多投票的 post 置于较新但投票较少的 post 之前。