mango sorting couchdb

sorting - mango - Clasificar vistas de CouchDB por valor



design view couchdb (7)

Basado en la respuesta de Avi, se me ocurrió esta función de lista de Couchdb que funcionó para mis necesidades, que es simplemente un informe de los eventos más populares (clave = nombre del evento, valor = asistentes).

ddoc.lists.eventPopularity = function(req, res) { start({ headers : { "Content-type" : "text/plain" } }); var data = [] while(row = getRow()) { data.push(row); } data.sort(function(a, b){ return a.value - b.value; }).reverse(); for(i in data) { send(data[i].value + '': '' + data[i].key + "/n"); } }

Como referencia, aquí está la función de vista correspondiente:

ddoc.views.eventPopularity = { map : function(doc) { if(doc.type == ''user'') { for(i in doc.events) { emit(doc.events[i].event_name, 1); } } }, reduce : ''_count'' }

Y el resultado de la función de lista (recortada):

165: Design-Driven Innovation: How Designers Facilitate the Dialog 165: Are Your Customers a Crowd or a Community? 164: Social Media Mythbusters 163: Don''t Be Afraid Of Creativity! Anything Can Happen 159: Do Agencies Need to Think Like Software Companies? 158: Customer Experience: Future Trends & Insights 156: The Accidental Writer: Great Web Copy for Everyone 155: Why Everything is Amazing But Nobody is Happy

Estoy probando CouchDB para ver cómo podría manejar el registro de algunos resultados de búsqueda. Lo que me gustaría hacer es producir una vista en la que pueda generar las consultas principales a partir de los resultados. Por el momento tengo algo como esto:

Ejemplo de porción de documento

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

Función de mapa (no es exactamente lo que necesito / quiero pero es lo suficientemente bueno para probar)

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

Reducir la función

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

Ahora, esto me dará resultados en un formato en el que un término de consulta es la clave y el recuento de ese término a la derecha, lo cual es genial. Pero me gustaría ordenar por el valor, no la clave. Por los sonidos de esto, esto aún no es posible con CouchDB.

Entonces, ¿alguien tiene alguna idea de cómo puedo obtener una vista donde tengo una versión ordenada de los términos de la consulta y sus recuentos relacionados? Soy muy nuevo en CouchDB y no puedo pensar en cómo escribiría las funciones necesarias.


Cada solución anterior romperá el rendimiento de sofá, creo. Soy muy nuevo en esta base de datos. Como sé que las vistas de couchdb preparan los resultados antes de ser consultados. Parece que necesitamos preparar los resultados manualmente. Por ejemplo, cada término de búsqueda residirá en la base de datos con recuentos de aciertos. Y cuando alguien busca, se buscarán sus términos de búsqueda e incrementará el recuento de visitas. Cuando queremos ver la popularidad del término de búsqueda, emitirá un par (hitcount, searchterm).


El Link Retrieve_the_top_N_tags parece estar roto, pero encontré otra solución here .

Citando al desarrollador que escribió esa solución:

en lugar de devolver los resultados marcados por la etiqueta en el paso del mapa, en su lugar, emitiría cada aparición de cada etiqueta. Luego, en el paso de reducción, calcularía los valores de agregación agrupados por etiqueta usando un hash, lo transformaría en una matriz, lo ordenaría y elegiría los 3 principales.

Como se afirma en los comentarios, el único problema sería en el caso de una larga cola:

El problema es que debes tener cuidado con la cantidad de etiquetas que obtienes; si el resultado es más grande que 500 bytes, tendrá a couchdb quejándose de él, ya que "reducir tiene que reducirse efectivamente". Sin embargo, 3 o 6 o incluso 20 etiquetas no deberían ser un problema.

Me funcionó a la perfección, ¡mira el enlace para ver el código!


Es cierto que no hay una respuesta sencilla. Sin embargo, hay varios patrones.

  1. http://wiki.apache.org/couchdb/View_Snippets#Retrieve_the_top_N_tags . Personalmente, no me gusta esto porque reconocen que es una solución frágil, y el código no es relajante.

  2. La respuesta de Avi, que es clasificar en memoria en su aplicación.

  3. couchdb-lucene que parece que todos se encuentran necesitando eventualmente!

  4. Lo que me gusta es lo que dijo Chris en la cita de Avi. Relajarse. En CouchDB, las bases de datos son livianas y se destacan por brindarle una perspectiva única de sus datos. Hoy en día, todo gira alrededor de la replicación filtrada, que consiste en dividir subconjuntos de sus datos para ponerlos en un DB separado.

    De todos modos, los conceptos básicos son simples. Usted toma sus .rows de la salida de la vista y los inserta en un DB separado que simplemente emite una clave en el recuento. Un truco adicional es escribir una función _list muy simple. Enumera "renderizar" la salida de sofá sin procesar en diferentes formatos. Su función _list debe salir

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

    Lo que hará es formatear la salida de la vista exactamente de la manera que la API _bulk_docs requiere. Ahora puede canalizar el rizo directamente en otro rizo:

    curl host:5984/db/_design/myapp/_list/bulkdocs_formatter/query_popularity / | curl -X POST host:5984/popularity_sorter/_design/myapp/_view/by_count

  5. De hecho, si su función de lista puede manejar todos los documentos, puede hacer que los ordene ellos mismos y devolverlos al cliente ordenado.


Esta es una vieja pregunta, pero creo que todavía merece una respuesta decente (pasé al menos 20 minutos buscando la respuesta correcta ...)

No estoy de acuerdo con las otras sugerencias en las respuestas aquí y siento que son insatisfactorias. Especialmente, no me gusta la sugerencia de ordenar las filas en la capa aplicativa, ya que no se escala bien y no se trata de un caso en el que se necesita limitar el conjunto de resultados en la base de datos.

El mejor enfoque que encontré se sugiere en este hilo y postula que si necesita ordenar los valores en la consulta, debe agregarlos al conjunto de claves y luego consultar la clave usando un rango, especificando la clave deseada y aflojando la Rango de valores. Por ejemplo, si su clave está compuesta por país, estado y ciudad:

emit([doc.address.country,doc.address.state, doc.address.city], doc);

A continuación, consulta solo el país y obtiene la clasificación gratuita del resto de los componentes clave:

startkey=["US"]&endkey=["US",{}]

En caso de que también necesite revertir el orden, tenga en cuenta que definir descending: true simple descending: true no será suficiente. En realidad, necesita invertir el orden de las teclas de inicio y fin, es decir:

startkey=["US",{}]&endkey=["US"]

Ver más referencia en esta gran source .


Esto apareció en la lista de correo de usuarios de CouchDB, y Chris Anderson, uno de los principales desarrolladores, escribió:

Esta es una solicitud común, pero no respaldada directamente por las vistas de CouchDB: para ello, deberá copiar la consulta group-reduce a otra base de datos y crear una vista para ordenar por valor.

Esta es una compensación que hacemos a favor de las consultas de rango dinámico y los índices incrementales.

Necesitaba hacer esto recientemente también, y terminé haciéndolo en mi nivel de aplicaciones. Esto es fácil de hacer en 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… });

Este ejemplo se ejecuta en Node.js y usa node-couchdb , pero se puede adaptar fácilmente para ejecutarse en un navegador u otro entorno de JavaScript. Y, por supuesto, el concepto es portátil para cualquier lenguaje / entorno de programación.

HTH!


No estoy seguro del 1 que tienes como resultado devuelto, pero estoy seguro de que esto debería ser el truco:

emit([doc.hits, split[i]], 1);

Las reglas de clasificación se definen en los documentos.