我需要制作一个带有扭曲的术语频率映射/减少:
- 小写术语
- 删除停止字
- 词干
- 分成短语
- 计算每个短语
- 按计数递减排序
我所说的短语划分如下:假设我有一个标题"大卫打扫房间",我想在结果中计算以下短语:
大卫大卫打扫卫生大卫打扫房间清洁打扫房间房间
我目前有简单的解决方案,不做任何短语,停止字或词干:
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,然后每天更新最新记录。
您所描述的功能列表正是MongoDB的文本索引所提供的:
- 基于语言的词干
- 不区分大小写的索引
- 设置相对字段权重的选项
- 搜索单个术语、多个术语或短语
- 返回的结果按相关性评分
如果你想建立自己的全文搜索,Map/Reduce不是最好的方法。对于基本解决方案,您最好使用普通的find()
迭代文档,并根据关键字搜索要求构建多关键字索引。
除了MongoDB之外,还可以集成其他文本搜索选项,以提供更高级的搜索选项,如facets、集群和关键字接近度。
在mongodb 2.6的最新版本中包含FTS(无测试版,发布版)。这个版本包括用雪球做词干,每种语言都有停止语。