2013-06-03 212 views
2

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

回答

4

当然有不止一种方法。我会去做一些简单的事情。比方说你的文档看起来有点像这样:

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

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

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 

这意味着世界“的”出现45页的4倍和70页的7倍,您可以提取您的逗号分隔你从它需要的清单。发生次数是奖金。

- 编辑 -

您还可以在查询中使用group_level = 2。如果你不这样做,查询的结果只会是单一行,并且你的所有文档都被计数。

+0

感谢您快速回答。我必须在稍后测试它,但如果我想要一个列表:伟大的45,70,234.伟大的字应该只列出一次。并且该函数应该为数据库中的所有单词(文档)执行此操作。 – user2447116

+0

如何使用reduce函数来管理多个页面编号? – user2447116

+0

嗯,我不知道Java,或者couchdb的api绑定。我的观点是,当你查询这样的视图时,你会得到键值对的列表。你的密钥的形式是[“World”,page_number]。要获取列表,您只需将所有行的键与第一个元素相同并提取第二个元素。由于减少了它,它的独特性。 我刚刚意识到的还有一件事,您还需要使用group_level = 2来查询您的查询结果。如果你不这样做,你会在结果中得到一行。 –