我有一个java程序,可以读取PDF文件的所有单词。我将带有页码的单词保存在数据库(couchDB)中。现在我想编写一个映射和一个化简函数,其中列出每个单词以及该单词出现的页码,但如果单词在一页上出现多次,我只需要一个条目。结果应该是一行包含单词,第二行包含页码列表(用逗号分隔的字符串)。每个带有页码的单词都是 couchDB 中的一个单独文档。 如何使用映射缩减函数(过滤页码的相同条目)来做到这一点? 感谢帮助。
最佳答案
当然有不止一种方法可以做到这一点。我会选择简单的东西。假设您的文档看起来有点像这样:
{ 'type': 'word-index', 'word': 'Great', 'page_number': 45 }
这是在第 45 页找到“Great”一词的结果。现在您的 View 索引由 View 函数创建:
function map(doc) {
if (doc.type == 'word-index') {
emit([doc.word, doc.page_number], null);
}
}
对于减少部分,只需使用“_count”内置函数。
现在要获取书中所有出现单词“Great”的列表,只需使用 startkey=["Great"] 和 endkey=["Great", {}] 查询 View 即可。现在结果看起来有点像:
["Great", 45], 4
["Great", 70], 7
这意味着世界“伟大”在第 45 页出现了 4 次,在第 70 页出现了 7 次。您可以从中提取所需的逗号分隔列表。出现的次数是一个奖励。
--编辑--
您还必须在查询中使用 group_level=2。如果不这样做,查询结果将只是一行,其中包含您拥有的所有文档的计数。
关于mapreduce - CouchDB中的map-reduce函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16892922/