【问题标题】:"Auto-complete" tags with MapReduce in MongoDb在 MongoDb 中使用 MapReduce 的“自动完成”标签
【发布时间】:2012-07-17 08:34:43
【问题描述】:

短版:我需要从Posts 集合中获取与/web/ 或任何其他术语匹配的不同标签的数组。


我对实施 MapReduce 模式来提供“自动完成”字段有疑问。您认为这是最好的方法吗?

我的Posts 收藏有如下文档:

{
    'title': 'A great post',
    'tags': ['web2.0', 'monetize', 'cloud', 'someOtherDumbTerm']
}
{
    'title': 'Another great post',
    'tags': ['monetize', 'seo-optimization', 'web3.0']
}

如果搜索/web/,我会得到如下结果:["web2.0", "web3.0"]

我的 MapReduce 函数如下:

var mapFn = function(){
    if( this.tags ){
        this.tags.forEach(function(value){
            if (value.match(/web/i)){
                emit('web', value);
            }
        });
    }
};
var reduceFn = function(key, values){
    return {result:values};
};

db.runCommand({
    mapreduce: 'posts',
    out: {inline:1},
    map: mapFn,
    reduce: reduceFn,
    query: {tags:/web/}
});

我正在考虑将标签存储在不同的集合中并定期搜索它们,但我似乎发现多年 RDBMS 学习留下的残留直觉。我也不知道这类查询的性能或其他影响,而且文档似乎对这种情况不是很有用。

谢谢!


我最终做了什么

实际上我最终只使用 MapReduce 来分析所述标签。

我按照描述的方式将它们存储在不同的集合中,注意将其规范化为基本 ASCII(即没有重音符号等)以进行正则表达式搜索,并保留原始术语。然后我将 tag 对象 id 引用到另一个集合中的 post id。

所有这些我都变成了一个不同的应用程序来服务不同的客户。事实证明,它是满足我特殊需求的最佳解决方案。

【问题讨论】:

    标签: mongodb mapreduce database-schema


    【解决方案1】:

    我认为将标签映射/减少到不同的集合中听起来很合理。

    您无法实时运行 Map/Reduce 查询。而且您不能使用标准的“查找”查询从现有集合中获取您想要的标签。如果您的标签自动完成系统不包含过去一小时或最后一天的新标签,或者您的 MapReduce 作业运行的频率如何,您可能并不关心。

    【讨论】:

    • 我没有想过,但也许这是最好的方法:使用out: {merge: "tagIndexes"} 并实时查询。谢谢!
    • 我最终做了一件完全不同的事情,但你的回答帮助我找到了 Map/Reduce 的一个很好的用途。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-27
    • 2016-09-02
    相关资源
    最近更新 更多