【发布时间】:2012-03-27 16:32:11
【问题描述】:
我有一些总和数据,使用一些相对简单的 map/reduce 视图很容易生成。但是我们想根据组缩减视图values(而不是键)对数据进行排序。有人建议我们可以使用couchdb-lucene 来执行此操作。但是怎么做?我不清楚如何使用全文索引对这类数据进行快速排名。
我们已经拥有的
一个过度简化的示例视图如下所示:
by_sender: {
map: "function(doc) { emit(doc.sender, 1); }",
reduce: "function(keys, values, rereduce) { return sum(values); }"
}
返回的结果有点类似于以下(使用group=true 运行时):
{"rows":[
{"key":"a@example.com","value":2},
{"key":"aaa@example.com","value":1},
{"key":"aaap@example.com","value":34},
{"key":"aabb@example.com","value":1},
... thousands or tens of thousands of rows ...
]}
我们想要什么
这些是按键排序的,但我需要根据值对数据进行排序,如下所示:
{"rows":[
{"key":"xyzzy@example.com","value":847},
{"key":"adam@example.com","value":345},
{"key":"karl@example.com","value":99},
{"key":"aaap@example.com","value":34},
... thousands or tens of thousands of rows ...
]}
而且我需要尽可能快地对它进行排序(例如,如果更新索引只需要
更多背景信息:我们已经尝试过的内容
Sorting CouchDB Views By Value 上的最佳答案提供了四个可行的选项,我们已经按照难度递增的顺序进行了尝试:
- 首先我们在客户端对结果进行了排序,但这方式太慢了。
- 接下来我们创建了一个对数据进行排序的列表函数。快了一点,但还是太慢了。
- 链式 Map-Reduce 视图应该可以轻松处理此问题。
- 有人指出 Cloudant 的 Chained Map-Reduce Views。它们不在BigCouch 中,但属于 Cloudant 服务的一部分,遗憾的是,这些服务目前不在我们的预算之内。
- 我使用 _bulk_docs API 启动了应用层实现。如果您想在避免竞争条件等的同时尽可能保持更新,这很棘手。我可以继续这种方法,但它不放松。 :(
- 答案建议使用couchdb-lucene。但是我对全文搜索还不够熟悉,无法理解如何让它做比索引文档和返回搜索结果更复杂的事情。我什至不知道从哪里开始。
【问题讨论】:
-
您好,我不确定您所说的列表视图是什么意思?您可以尝试将分组结果插入到单独的数据库中,并且可以轻松地进行排序。我想您可以使用 cronjob 定期更新它。
-
对不起,我的意思是列出 function 而不是列出 view。我已经更新了问题。
-
我也忘了提到我们需要这些数据尽可能接近实时。如果将新文档吸收到各种视图索引中只需要 zincrby messages:by_sender 1 $sender。
-
你在做一些日志记录吗?我认为您可以使用单独的文档来跟踪计数。插入新文档时,查找email地址对应的文档,如果不存在则新建一个文档,如果存在就加1。
-
是的,我们绝对可以采用双重输入法。但如果我这样做,我可能会将计数存储在 redis zset 而不是 couchdb 文档中。 :)