2

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

4

1 回答 1

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);
    }
}

对于减少部分,只需使用“_count”内置。

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

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

这意味着世界“Great”在第 45 页出现了 4 次,在第 70 页出现了 7 次。您可以从中提取您需要的逗号分隔列表。出现的次数是一个奖励。

- 编辑 -

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

于 2013-06-03T09:01:04.190 回答