我们有一个帖子分析要求,即对于一个特定的帖子,我们需要返回一个主要与之相关的帖子列表,逻辑是比较帖子中常见标签的数量。例如:
postA = {"author":"abc",
"title":"blah blah",
"tags":["japan","japanese style","england"],
}
可能还有其他带有标签的帖子,例如:
postB:["japan", "england"]
postC:["japan"]
postD:["joke"]
所以基本上,postB 得到 2 个计数,postC 得到 1 个计数,与 postA 中的标签相比,postD 得到 0 个计数,不会包含在结果中。
我现在的理解是使用 map/reduce 来生成结果,我了解 map/reduce 的基本用法,但我无法为这个特定目的找到解决方案。
有什么帮助吗?或者有没有更好的方法,如自定义排序功能来解决它?我目前正在使用pymongodb,因为我是python开发人员。
你应该在标签上创建一个索引:
db.posts.ensure_index([('tags', 1)])
并搜索与帖子 A 共享至少一个标签的帖子:
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 本身按交集的大小进行排序和限制。