2012-02-14 57 views
0

短版:我需要得到匹配/web/不同的标签或任何其他条款的数组对于这个问题,出了Posts收藏。“自动完成”标签与MapReduce的


我对执行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。

所有这些我变成了一个不同的应用程序来服务于不同的客户端。它原来是我特别需要的最佳解决方案。

回答

0

我认为Map/Reducing the tags into a different collection听起来很合理。

您无法实时运行Map/Reduce查询。而且,您不能使用标准的“查找”查询来获取您想要从现有集合中获取的标签。而且您可能不在乎自己的代码自动完成系统是否在最后一小时或最后一天不包含新代码,或者您的MapReduce作业经常运行。

+0

我还没有想过,但也许这是最好的方法:使用'out:{merge:“tagIndexes”}'并实时查询。谢谢! – Roberto 2012-02-15 23:27:33

+0

我最终做了一件完全不同的事情,但你的回答帮助我找到了Map/Reduce的一个很好的用法。谢谢! – Roberto 2012-02-23 08:56:22