Я проверяю CouchDB, чтобы видеть, как он мог обработать вход некоторых результатов поиска. То, что я хотел бы сделать, является продуктом представление, где я могу произвести главные запросы из результатов. В данный момент у меня есть что-то вроде этого:
Часть документа в качестве примера
{
"query": "+dangerous +dogs",
"hits": "123"
}
Функция карты (Не точно, в чем я нуждаюсь/хочу, но это достаточно хорошо для тестирования),
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.
У кого-либо есть какие-либо идеи того, как я могу получить представление, где у меня есть заказанная версия условий запроса и их связанных количеств? Я очень плохо знаком с CouchDB, и я просто не могу думать, как я записал бы необходимые функции.
Это правда, что нет однозначного ответа. Однако есть несколько закономерностей.
http://wiki.apache.org/couchdb/View_Snippets#Retrieve_the_top_N_tags. Мне лично это не нравится, потому что они признают, что это хрупкое решение, и код не выглядит расслабляющим.
Ответ Ави, который заключается в сортировке in-memory в вашем приложении.
couchdb-lucene, который, похоже, в конечном итоге нужен всем!
Что мне нравится, так это то, что Крис сказал в цитате Ави. Расслабьтесь. В CouchDB базы данных легковесны и прекрасно справляются с задачей дать вам уникальную перспективу ваших данных. В наши дни все говорят о фильтрованной репликации, которая заключается в выделении подмножеств ваших данных для размещения в отдельной БД.
В любом случае, основы просты. Вы берете ваши .rows
из вывода представления и вставляете их в отдельную БД, которая просто выдает ключ по счету. Дополнительным приемом является написание очень простой функции _list
. Списки "преобразуют" необработанный вывод couch в различные форматы. Ваша функция _list
должна выводить
{"docs":
[ {...view row1..,}
{...view row2...},
{...etc...}
]
}
Это позволит отформатировать вывод представления именно так, как того требует _bulk_docs
API. Теперь вы можете направить 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
На самом деле, если ваша функция списка может обрабатывать все документы, вы можете просто заставить ее сортировать их самостоятельно и возвращать клиенту отсортированными.
Я не уверен насчет числа 1 в качестве возвращаемого результата, но уверен, что это должно помочь:
emit ([doc.hits, split [i]], 1);
Этот появился в списке рассылки пользователей CouchDB, и Крис Андерсон, один из основных разработчиков, написал:
Это обычный запрос, но он не поддерживается напрямую CouchDB {{1 }} представления - для этого вам нужно скопировать запрос на сокращение группы в другую базу данных и построить представление для сортировки по значению.
Это компромисс, который мы делаем в пользу запросов с динамическим диапазоном и инкрементных индексов.
Мне тоже нужно было сделать это недавно, и в итоге я сделал это на уровне своего приложения. Это легко сделать в JavaScript:
db.view('mydesigndoc', 'myview', {'group':true}, function(err, data) {
if (err) throw new Error(JSON.stringify(err));
data.rows.sort(function(a, b) {
return a.value - b.value;
});
data.rows.reverse(); // optional, depending on your needs
// do something with the data…
});
Этот пример работает в Node.js и использует node-couchdb , но его можно легко адаптировать для работы в браузере или другом JavaScript. среда. И, конечно же, концепция переносима на любой язык / среду программирования.
HTH!