Mapreduce CouchDB中的map-reduce函数

Mapreduce CouchDB中的map-reduce函数,mapreduce,couchdb,Mapreduce,Couchdb,我有一个java程序,可以读取PDF文件中的所有单词。我将单词和页码保存在数据库(couchDB)中。现在我想写一个map和reduce函数,它列出每个单词所在的页码,但是如果单词在一个页面上出现不止一次,我只需要一个条目。结果应该是一行包含word,第二行包含页码列表(用逗号分隔的字符串)。每个带有页码的单词在couchDB中都是一个单独的文档。 如何使用map reduce功能(过滤相同的页码条目)实现这一点? 谢谢你的帮助 做这件事的方法肯定不止一种。我喜欢简单的东西。假设您的文档看起来有

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

做这件事的方法肯定不止一种。我喜欢简单的东西。假设您的文档看起来有点像这样:

{ 'type': 'word-index', 'word': 'Great', 'page_number': 45 }
这是在第45页找到“伟大”一词的结果。现在,视图索引由视图函数创建:

function map(doc) {
    if (doc.type == 'word-index') {
        emit([doc.word, doc.page_number], null);
    }
}
对于减少部分,只需使用内置的“\u count”

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

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

--编辑--


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

当然有多种方法可以做到这一点。我喜欢简单的东西。假设您的文档看起来有点像这样:

{ 'type': 'word-index', 'word': 'Great', 'page_number': 45 }
这是在第45页找到“伟大”一词的结果。现在,视图索引由视图函数创建:

function map(doc) {
    if (doc.type == 'word-index') {
        emit([doc.word, doc.page_number], null);
    }
}
对于减少部分,只需使用内置的“\u count”

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

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

--编辑--


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

谢谢您的快速回答。我必须稍后测试它,但是如果我想要一个列表:很棒的45,70,234。“伟大”这个词应该只列出一次。该函数应该对数据库中的所有单词(文档)执行此操作。如何使用reduce函数过滤多个页码?我不知道Java,也不知道couchdb的api绑定。我的观点是,当您查询这样的视图时,您将得到键值对列表。您的密钥的格式为[“世界”,页码]。要获得列表,只需获取键具有相同第一个元素的所有行,然后提取第二个元素。由于减少了它,它是独一无二的。我刚刚意识到的另一件事是,您还需要使用group_level=2来查询以获得此结果。如果你不这样做,你只会得到结果中的一行。@user2447116但如果我想要一个列表:很棒的45,70,234。单词great应该只列出一次,视图应该只用于服务的算法部分。如果您(真的)需要格式化数据服务器端,请使用列表。谢谢您的快速回答。我必须稍后测试它,但是如果我想要一个列表:很棒的45,70,234。“伟大”这个词应该只列出一次。该函数应该对数据库中的所有单词(文档)执行此操作。如何使用reduce函数过滤多个页码?我不知道Java,也不知道couchdb的api绑定。我的观点是,当您查询这样的视图时,您将得到键值对列表。您的密钥的格式为[“世界”,页码]。要获得列表,只需获取键具有相同第一个元素的所有行,然后提取第二个元素。由于减少了它,它是独一无二的。我刚刚意识到的另一件事是,您还需要使用group_level=2来查询以获得此结果。如果你不这样做,你只会得到结果中的一行。@user2447116但如果我想要一个列表:很棒的45,70,234。单词great应该只列出一次,视图应该只用于服务的算法部分。如果(确实)需要格式化服务器端数据,请使用列表。