CouchDB中的map-reduce函数

时间:2013-06-03 08:43:15

标签: mapreduce couchdb

我有一个java程序,它读取PDF文件的所有单词。我将带有pagenumbers的单词保存在数据库(couchDB)中。现在我想编写一个map和reduce函数,它将每个单词列在单词出现的页面中,但如果单词在页面上出现多次,我只需要一个条目。结果应该是带有word的行和带有listnumbers的列表(用逗号分隔的字符串)的第二行。带有pagenumber的每个单词都是couchDB中的一个单独文档。 如何使用map-reduce函数(过滤相同的pagenumbers条目)? 感谢帮助。

1 个答案:

答案 0 :(得分:4)

肯定有不止一种方法可以做到这一点。我会选择一些简单的事情。让我们说你的文件看起来像这样:

{ 'type': 'word-index', 'word': 'Great', 'page_number': 45 }

这是在第45页上找到“Great”一词的结果。现在您的视图索引由视图函数创建:

function map(doc) {
    if (doc.type == 'word-index') {
        emit([doc.word, doc.page_number], null);
    }
}

对于reduce部分,只需使用内置的“_count”。

现在要获取您书中所有出现的单词“Great”的列表,只需使用startkey = [“Great”]和endkey = [“Great”,{}]查询您的视图。现在结果看起来有点像:

["Great", 45], 4
["Great", 70], 7

这意味着世界“伟大”在第45页出现了4次,在第70页出现了7次。您可以从中提取所需的逗号分隔列表。发生的次数是奖金。

- 编辑 -

您还必须在查询中使用group_level = 2。如果不这样做,查询的结果将只是一行,并且计算掉你拥有的所有文件。