CouchDB中的map-reduce功能



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

肯定不止一种方法。我会选一些简单的。假设你的文档看起来像这样:

{ '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

这意味着世界"Great"在45页出现了4次,在70页出现了7次。您可以从中提取您需要的逗号分隔列表。出现的次数是额外的。

——编辑——

您还必须在查询中使用group_level=2。如果您不这样做,查询的结果将只是一个单行,并计数您拥有的所有文档。

最新更新