Meteor - 发布按个性化分数排序的集合

Posted

技术标签:

【中文标题】Meteor - 发布按个性化分数排序的集合【英文标题】:Meteor - publish a collection sorted on personalized score 【发布时间】:2016-05-04 22:45:45 【问题描述】:

我想发布一个集合,其中文档根据字段的组合和用户确定的上下文进行评分;并且返回的结果会根据这个分数进行排序,并且可能仅限于排名靠前的结果。

This 展示了如何在发布时在集合上添加transform 过滤器。但是,我不确定transform 是一种计算我想在排序中使用的字段的有效方法..

最后,如果使用 Mongo map reduce 根据计算出的分数快速返回推荐项目,那就太棒了,这可以并行完成。

@brett-mclain pointed out 如何在纯 Mongo 中完成一些 map reduce 排序。有一些 Meteor 包 out there 来扩展 Meteor 集合,但我在 Meteor 出版物中找不到如何使用它们(与方法相比)此外,here 映射减少输出被发送到另一个集合每次调用该方法时显然都会被覆盖。

这大概是我想要实现的逻辑:

/* Server */
Meteor.publish('getRecommendedItems', function() 
  var u = Users.findOne(this.userId);
  var scoreItem = function(item, u)  ... ;
  return Items.find(
    ,
    
      transformInParallel: function(doc) 
        doc.score = scoreItem(doc);
      ,
      sort: score: -1,
      limit: 10,
    
  );
);


/* Client template*/
Template.templateName.onCreated(function() 
  this.subscribe('getRecommendedItems');
  this.items = Items.find(, sort: score: -1);
);

除了score 之外,我可以在客户端访问,而无需在那里进行任何计算。

Meteor.methods 中做自定义事情似乎更容易,但Meteor.publish 感觉像是做这件事的自然场所;因为它是 Meteor 神奇反应发生的地方。

【问题讨论】:

Sorting mongodb by reddit ranking algorithm的可能重复 我已将此标记为重复项,并链接到有关通过在 MongoDB 中排序来实现 reddit 的时间衰减算法的 *** 问题。他们的解决方案是使用 map reduce:***.com/questions/22728668/… 这是一个非常有趣的帖子。我想知道如何在 Meteor 框架中执行这些 mongo 操作。我的理解是,Meteor 添加了一个向客户端提供实时更新的层,并且显然限制了实现此结果的操作。在 Meteor 集合中,有 .mapReduce 之类的注释,如果我遗漏了什么,请告诉我,否则我将编辑并重新打开问题 如果你在服务器中计算,你的服务器会压力 【参考方案1】:
  transformInParallel: function(doc) 
    doc.score = scoreItem(doc);
  ,
  sort: score: -1,
  limit: 10,

这将导致全数据库扫描。

时间衰减解决方案实际上是常见的编程测试问题,并不适合您的用例。

如果你的规模很小,只需预先计算一整套

score: ..., userId: ..., item: ...

文档在一个单独的集合中。像这样的十亿个小文档的索引将完全适合单个数据库服务器的 RAM;这最多适用于例如30,000 个项目和 30,000 个用户。

如果您的需求超出此范围,则必须考虑分数计算的哪一部分可以在用户之间共享。如果无法共享计算的任何部分,您应该了解 Facebook 如何在传统数据库上实现社交图。

【讨论】:

以上是关于Meteor - 发布按个性化分数排序的集合的主要内容,如果未能解决你的问题,请参考以下文章

按名称获取 Meteor 集合

个性化推荐排序详解

如何按用户角色个性化背包内容?

linux命令集合

用tensorflow学习贝叶斯个性化排序(BPR)

C++ 整数集合运算