"自动完成" MongoDb中使用MapReduce的标签

时间:2012-02-14 22:22:25

标签: mongodb mapreduce database-schema

简短版:我需要从/web/集合中获取一系列与Posts或其他任何术语匹配的不同标记。


我对实现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。

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

1 个答案:

答案 0 :(得分:0)

我认为Map /将标签缩减为不同的集合听起来非常合理。

您无法实时运行Map / Reduce查询。并且您无法使用标准的“查找”查询来获取您希望从现有集合中获得的标记。如果您的标签自动完成系统不包含过去一小时或最后一天的新标签,或者您的MapReduce作业经常运行,您可能并不在意。

相关问题