我们有一个发布分析要求,也就是说,对于特定帖子,我们需要返回与其主要相关的帖子列表,逻辑是比较帖子中常见标签的数量。例如:
postA = {"author":"abc",
"title":"blah blah",
"tags":["japan","japanese style","england"],
}
可能有其他帖子包含以下标签:
postB:["japan", "england"]
postC:["japan"]
postD:["joke"]
所以基本上,postB获得2个计数,postC在与postA中的标签比较时获得1个计数。 postD获得0并且不会包含在结果中。
我现在的理解是使用map / reduce来产生结果,我理解map / reduce的基本用法,但我无法找到针对这个特定目的的解决方案。
有任何帮助吗?或者有一种更好的方式,如自定义排序功能来解决它?我正在使用pymongodb,因为我是python开发人员。
答案 0 :(得分:1)
您应该在代码上创建索引:
db.posts.ensure_index([('tags', 1)])
并搜索与postA共享至少一个标记的帖子:
posts = list(db.posts.find({_id: {$ne: postA['_id']}, 'tags': {'$in': postA['tags']}}))
最后,在Python中用交集排序:
key = lambda post: len(tag for tag in post['tags'] if tag in postA['tags'])
posts.sort(key=key, reverse=True)
请注意,如果postA共享至少一个包含大量其他帖子的标签,则效果不佳,因为您将从Mongo向您的应用程序发送大量数据;遗憾的是,没有办法使用Mongo本身对交叉点的大小进行排序和限制。