我有一些使用一些相对简单的map / reduce视图很容易生成的求和数据。但我们希望根据组缩减视图值(而不是键)对数据进行排序。有人建议我们可以使用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 ...
]}
我需要尽可能快地对其进行排序(例如,如果更新索引只需要<100ms,则在查询中反映新数据之前不应该花费1分钟。)
更多背景信息:我们已尝试过的内容
Sorting CouchDB Views By Value上的最佳答案给出了四个可行的选项,我们已尝试提高难度顺序:
答案 0 :(得分:0)
我有类似的问题。需要计算每篇文章的投票数,并按投票数对文章进行排序。我已经解决了使用单独的文档来跟踪每个投票,以及另一个存储每篇文章的投票数的文档。我们称之为:文章,投票,得分。
我写了一个cron脚本,用于更新每篇文章的分数,计算“未注册”的投票。该脚本使用_count
reduce函数调用视图,其中仅发出“未注册”投票(注册== FALSE)。我使用选项group_results来获得每篇文章未注册的投票数,然后我更新每篇文章的分数,标记“已注册”投票。在这一点上,我有一个视图,发出每篇文章的分数和文章ID的值作为关键。所以文章可以按分数排序。使用此tecnique可以避免冲突。