我需要改变一个Term Frequency Map / Reduce:
我的意思是分成短语如下:说我有一个标题“大卫打扫房间”,我想在结果中计算以下短语:
大卫 大卫清理 大卫打扫房间 清理 打扫房间 房间
我目前有简单的解决方案,不会做任何短语,停止词语或词干:
var map = function() {
var summary = this.summary;
if (summary) {
// quick lowercase to normalize per your requirements
summary = summary.toLowerCase().split(" ");
for (var i = summary.length - 1; i >= 0; i--) {
// might want to remove punctuation, etc. here
if (summary[i]) { // make sure there's something
emit(summary[i], 1); // store a 1 for each word
}
}
}
};
var reduce = function( key, values ) {
var count = 0;
values.forEach(function(v) {
count +=v;
});
return count;
}
我不确定mongodb map / reduce是否可以支持阻止和停止开箱即用的单词以及如何将它们放在一起。
澄清:Map / Reduce的结果将是一个包含术语和频率的集合。我需要保持这个集合是最新的(每日),以便我们可以看到最常用的术语。我希望能够运行最初的M / R,然后每日更新最新记录。
答案 0 :(得分:0)
您描述的功能列表正是MongoDB的text index提供的功能:
如果您想构建自己的全文搜索,Map / Reduce不是最好的方法。对于基本解决方案,您最好根据关键字搜索要求使用普通find()
和build a multi-key index来迭代文档。
在MongoDB之外,可以集成other text search options以提供更高级的搜索选项,例如构面,群集和关键字邻近度。
答案 1 :(得分:0)
在最新版本mongodb 2.6中包括FTS(没有beta,发布)。这个版本包括用雪球扼杀,每种语言的停用词。