【问题标题】:Sorting CouchDB data using couch-lucene使用 couch-lucene 对 CouchDB 数据进行排序
【发布时间】: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 上的最佳答案提供了四个可行的选项,我们已经按照难度递增的顺序进行了尝试:

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

【问题讨论】:

  • 您好,我不确定您所说的列表视图是什么意思?您可以尝试将分组结果插入到单独的数据库中,并且可以轻松地进行排序。我想您可以使用 cronjob 定期更新它。
  • 对不起,我的意思是列出 function 而不是列出 view。我已经更新了问题。
  • 忘了提到我们需要这些数据尽可能接近实时。如果将新文档吸收到各种视图索引中只需要 zincrby messages:by_sender 1 $sender。
  • 你在做一些日志记录吗?我认为您可以使用单独的文档来跟踪计数。插入新文档时,查找email地址对应的文档,如果不存在则新建一个文档,如果存在就加1。
  • 是的,我们绝对可以采用双重输入法。但如果我这样做,我可能会将计数存储在 redis zset 而不是 couchdb 文档中。 :)

标签: lucene couchdb


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多