Tri CouchDB Vues En Valeur
Je suis du test de CouchDB pour voir comment il pourrait gérer la journalisation des résultats de recherche. Ce que je voudrais faire est de produire un point de vue où je peux produire le top des requêtes à partir des résultats. Pour le moment j'ai quelque chose comme ceci:
Document de l'exemple partie
{
"query": "+dangerous +dogs",
"hits": "123"
}
Fonction Map
(Pas exactement ce dont j'ai besoin/envie, mais c'est assez bon pour les tests)
function(doc) {
if (doc.query) {
var split = doc.query.split(" ");
for (var i in split) {
emit(split[i], 1);
}
}
}
Fonction De Réduction
function (key, values, rereduce) {
return sum(values);
}
Maintenant, cela va me faire des résultats dans un format où un terme de la requête est la clé et le nombre de ce terme sur la droite, ce qui est excellent. Mais j'aimerais qu'il a ordonné par la valeur, non pas la clé. De les sons de celui-ci, ce n'est pas encore possible avec CouchDB.
Si quelqu'un a une idée de comment je peux obtenir un point de vue où j'ai commandé la version des termes de la requête & leur compte? Je suis très nouveau à CouchDB et je ne peux pas penser comment allais-je écrire les fonctions nécessaires.
Vous devez vous connecter pour publier un commentaire.
Il est vrai qu'il n'y a pas de morts-réponse simple. Il existe plusieurs modèles mais.
http://wiki.apache.org/couchdb/View_Snippets#Retrieve_the_top_N_tags. Je ne suis pas personnellement aime, parce qu'ils reconnaissent que c'est un fragile de la solution, et le code n'est pas de détente-à la recherche.
Avi réponse, qui est de les trier en mémoire dans votre application.
couchdb-lucene qui il semble que tout le monde se retrouvent à devoir éventuellement!
Ce que j'aime, c'est ce que Chris a dit en Avi de devis. Détendez-vous. Dans CouchDB, les bases de données sont légers et excel en vous donnant un point de vue unique de vos données. Ces jours-ci, le buzz est tout au sujet de filtre de réplication qui est tout au sujet de tranchant sous-ensembles de données à mettre en DB distinct.
De toute façon, les bases sont simples. Vous prenez votre
.rows
de la sortie de la vue et de l'insérer dans un DB distinct qui émet simplement posés sur le comte. Une astuce supplémentaire est d'écrire une simple_list
fonction. Les listes de "rendre" les premières canapé sortie dans différents formats. Votre_list
de la fonction de sortieCe que cela va faire est de formater la sortie de la vue, exactement ce que les
_bulk_docs
API exige. Maintenant, vous pouvez pipe curl directement dans un autre curl:En fait, si votre liste de fonction peut gérer tous les docs, vous pouvez juste avoir les trier lui-même et de le retourner au client triés.
couchdb-lucene
. Il n'est pas clair pour moi comment faire pour utiliser un index de texte intégral rapidement rang des balises (ou tout autre similaire réduit l'affichage des résultats).Ce venu sur le CouchDB-user mailing liste, et Chris Anderson, l'un des principaux développeurs, a écrit:
J'avais besoin de le faire récemment, et j'ai fini par le faire dans mon application de niveau. C'est facile à faire en JavaScript:
Cet exemple exécute dans Node.js et utilise nœud-couchdb, mais il peut facilement être adapté pour fonctionner dans un navigateur ou un autre environnement JavaScript. Et bien sûr, le concept est transférable à tout langage de programmation/environnement.
HTH!
data.rows.reverse()
simplement en changeant votre fonction de tri àreturn b.value - a.value
C'est une vieille question, mais je pense qu'il mérite tout de même un décent réponse (j'ai passé au moins 20 minutes sur la recherche de la bonne réponse...)
Je désapprouve les autres suggestions dans les réponses et se sentent qu'ils ne sont pas satisfaisantes. En particulier, je n'aime pas la suggestion de trier les lignes dans la couche applicative, comme il n'est pas à l'échelle et n'a pas affaire à un cas où vous avez besoin de limiter le jeu de résultats dans la DB.
La meilleure approche que j'ai trouvé est suggéré dans ce fil et il postule que si vous avez besoin de trier les valeurs dans la requête, vous devez les ajouter dans le jeu de clés et alors de requête de la clé à l'aide d'une gamme de spécification de la touche désirée et le desserrage de la plage de valeurs. Par exemple, si votre clé est composée de pays, de l'état et de la ville:
Alors vous interrogez tout le pays et obtenir gratuitement des tri sur le reste des composantes clés:
Dans le cas où vous aussi vous avez besoin pour inverser l'ordre de noter que la simple définition de
descending: true
ne suffira pas. Vous avez réellement besoin pour inverser le début et la fin de commande de clés, c'est à dire:Voir plus de référence à ce grand source.
Je n'en suis pas sûr à propos de la 1 que vous avez que votre renvoyé de résultat, mais je suis certain que cela devrait faire l'affaire:
emit([doc.hits, split[i]], 1);
La les règles de tri sont définis dans la documentation.
Basé sur Avi réponse, je suis venu avec cette Couchdb liste en fonction de ce qui a fonctionné pour mes besoins, qui est simplement un rapport de la plus populaire des événements (clé=nom de l'événement, valeur=participants).
Pour référence, voici la vue correspondante de la fonction:
Et la sortie de la fonction de liste (ciselée):
Toutes les solutions ci-dessus ne cassera couchdb de performance, je pense. Je suis très nouveau à cette base de données. Comme je sais que couchdb vue de préparer les résultats avant d'être interrogée. Il semble que nous avons besoin de préparer les résultats manuellement. Par exemple, chaque terme de recherche résident dans la base de données avec hit compte. Et quand quelqu'un cherche, ses termes de recherche seront recherchés et les augmentations du nombre d'accès. Quand nous voulons voir la popularité du terme de recherche, il émet (hitcount, searchterm) paire.
Le Lien Retrieve_the_top_N_tags semble être cassé, mais j'ai trouvé une autre solution ici.
Citant le dev qui a écrit cette solution:
Comme indiqué dans les commentaires, le seul problème serait dans le cas d'une longue queue:
Il a fonctionné parfaitement pour moi, cliquez sur le lien pour voir le code !