使用couch-lucene对CouchDB数据进行排序

时间:2012-03-27 16:32:12

标签: lucene couchdb

我有一些使用一些相对简单的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上的最佳答案给出了四个可行的选项,我们已尝试提高难度顺序:

  1. 首先我们对客户端的结果进行了排序,但那是方式太慢了。
  2. 接下来,我们创建了一个对数据进行排序的列表函数。快一点,但仍然太慢。
  3. 链式Map-Reduce Views应该可以轻松处理这个问题。
    • 有人指出Cloudant的Chained Map-Reduce Views。它们不在BigCouch,但是Cloudant的服务的一部分,遗憾的是,目前我们的预算不在其中。
    • 我使用_bulk_docs API启动了应用程序层实现。如果你想让更新保持尽可能快,同时避免竞争条件等,这是很棘手的。我可以继续这种方法,但它放松。 :(
  4. 答案建议使用couchdb-lucene。但是我对全文搜索还不是很熟悉,以了解如何让它做更复杂的事情而不是索引文档并返回搜索结果。我甚至不知道从哪里开始。

1 个答案:

答案 0 :(得分:0)

我有类似的问题。需要计算每篇文章的投票数,并按投票数对文章进行排序。我已经解决了使用单独的文档来跟踪每个投票,以及另一个存储每篇文章的投票数的文档。我们称之为:文章,投票,得分。 我写了一个cron脚本,用于更新每篇文章的分数,计算“未注册”的投票。该脚本使用_count reduce函数调用视图,其中仅发出“未注册”投票(注册== FALSE)。我使用选项group_results来获得每篇文章未注册的投票数,然后我更新每篇文章的分数,标记“已注册”投票。在这一点上,我有一个视图,发出每篇文章的分数和文章ID的值作为关键。所以文章可以按分数排序。使用此tecnique可以避免冲突。