0

我们有一个发帖分析的需求,即对于一个具体的帖子,我们需要返回一个与之关联度最高的帖子列表,逻辑是比较帖子中常见标签的数量。例如:

    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 开发人员。

4

1 回答 1

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 本身对交叉点的大小进行排序和限制。

于 2012-05-17T16:52:50.073 回答