我正在测试 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 非常陌生,我只是想不出如何编写所需的函数。
最佳答案
确实没有绝对简单的答案。然而,有几种模式。
http://wiki.apache.org/couchdb/View_Snippets#Retrieve_the_top_N_tags 。我个人不喜欢这个,因为他们承认这是一个脆弱的解决方案,而且代码看起来并不轻松。
Avi 的答案是在应用程序的内存中进行排序。
couchdb-lucene似乎每个人最终都发现自己需要它!
我喜欢的是 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
事实上,如果您的列表函数可以处理所有文档,您可以让它自行对它们进行排序并将排序后的它们返回给客户端。
关于按值对 CouchDB View 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817703/