按值对 CouchDB View 进行排序

标签 sorting couchdb

我正在测试 CouchDB,看看它如何处理记录一些搜索结果。我想做的是生成一个 View ,在其中我可以从结果中生成最常见的查询。目前我有这样的事情:

示例文档部分

{
  "query": "+dangerous +dogs",
  "hits": "123"
}

map 功能 (不完全是我需要/想要的,但它足以用于测试)

function(doc) {
  if (doc.query) {
    var split = doc.query.split(" ");
    for (var i in split) {
      emit(split[i], 1);
    }
  }
}

归约函数

function (key, values, rereduce) {
  return sum(values);
}

现在,这将为我提供一种格式的结果,其中查询术语是关键,并且右侧该术语的计数,这很棒。但我希望它按值而不是键排序。听起来,这对于 CouchDB 来说还不可能。

那么,有谁知道如何获取查询术语及其相关计数的有序版本的 View ?我对 CouchDB 非常陌生,我只是想不出如何编写所需的函数。

最佳答案

确实没有绝对简单的答案。然而,有几种模式。

  1. http://wiki.apache.org/couchdb/View_Snippets#Retrieve_the_top_N_tags 。我个人不喜欢这个,因为他们承认这是一个脆弱的解决方案,而且代码看起来并不轻松。

  2. Avi 的答案是在应用程序的内存中进行排序。

  3. couchdb-lucene似乎每个人最终都发现自己需要它!

  4. 我喜欢的是 Chris 在 Avi 的引言中所说的话。放松。在 CouchDB 中,数据库是轻量级的,并且擅长为您提供数据的独特视角。如今,热门话题都是关于过滤复制,即切出数据子集以放入单独的数据库中。

    无论如何,基础知识很简单。您从 View 输出中获取 .rows 并将其插入到一个单独的数据库中,该数据库仅发出基于计数的键控。另一个技巧是编写一个非常简单的 _list 函数。列出将原始沙发输出“渲染”为不同的格式。您的 _list 函数应该输出

    { "docs":
        [ {..view row1...},
          {..view row2...},
          {..etc...}
        ]
    }
    

    这将完全按照 _bulk_docs API 要求的方式格式化 View 输出。现在您可以将curl直接通过管道传输到另一个curl中:

    curl host:5984/db/_design/myapp/_list/bulkdocs_formatter/query_popularity \
     | curl -X POST host:5984/popularity_sorter/_design/myapp/_view/by_count
    
  5. 事实上,如果您的列表函数可以处理所有文档,您可以让它自行对它们进行排序并将排序后的它们返回给客户端。

关于按值对 CouchDB View 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817703/

相关文章:

python - 按字母顺序排序 URL 以下载图像

sorting - 获取int的第一个数字

groovy - 如何防止 groovy RESTClient 对包含 %2F 代码的路径进行 url 编码?

json - CouchDB 中奇怪的 JSON

jquery - cloudant:检索一些临时用户字段

javascript - 使用 javascript 对项目列表进行排序

algorithm - 搜索和排序大数据集

mongodb - 在 MongoDB 中对 $geoWithin 地理空间查询进行排序

node.js - 在 Cloudant 上的生产数据库和登台数据库之间移动数据

sql-server - 批量加载 CouchDB 时遇到的问题