Pregunta

Estoy usando la siguiente función de vista para iterar sobre todos los elementos de la base de datos (para encontrar una etiqueta), pero creo que el rendimiento es muy pobre si el conjunto de datos es grande. ¿Algún otro enfoque?

def by_tag(tag):
return  '''
        function(doc) {
            if (doc.tags.length > 0) {
                for (var tag in doc.tags) {
                    if (doc.tags[tag] == "%s") {
                        emit(doc.published, doc)
                    }
                }
            }
        };
        ''' % tag
¿Fue útil?

Solución

Descargo de responsabilidad: no probé esto y no sé si puede funcionar mejor.

Crear una vista de permiso única:

function(doc) {
  for (var tag in doc.tags) {
    emit([tag, doc.published], doc)
  }
};

Y consulta con _view / your_view / all? startkey = ['your_tag_here'] & amp; endkey = ['your_tag_here', {}]

La estructura JSON resultante será ligeramente diferente, pero igual obtendrá la clasificación de la fecha de publicación.

Otros consejos

Puede definir una sola vista permanente, como sugiere Bahadir. sin embargo, al hacer este tipo de indexación, no genera el documento para cada clave. En su lugar, emita ([tag, doc.published], null). En las versiones actuales, tendría que hacer una búsqueda por separado para cada documento, pero el troncal SVN ahora tiene soporte para especificar " include_docs = True " en la cadena de consulta y CouchDB fusionará automáticamente los documentos en su vista por usted, sin la sobrecarga de espacio.

Estás en el buen camino con la vista. Una lista de pensamientos sin embargo:

La generación de vistas es incremental. Si su tráfico de lectura es mayor que el tráfico de escritura, entonces sus vistas no causarán ningún problema. Las personas que están preocupadas por esto generalmente no deberían estarlo. Marco de referencia, debería preocuparse si está volcando cientos de registros en la vista sin una actualización.

Emitir un documento completo ralentizará las cosas. Solo debe emitir lo necesario para usar la vista.

No estoy seguro de cuál es el valor == "% s " El rendimiento sería, pero no deberías pensar demasiado las cosas. Si hay una matriz de etiquetas debe emitir las etiquetas. Por supuesto, si espera una matriz de etiquetas que contendrá no cadenas, ignore esto.

# Works on CouchDB 0.8.0
from couchdb import Server # http://code.google.com/p/couchdb-python/

byTag = """
function(doc) {
if (doc.type == 'post' && doc.tags) {
    doc.tags.forEach(function(tag) {
        emit(tag, doc);
    });
}
}
"""

def findPostsByTag(self, tag):
    server = Server("http://localhost:1234")
    db = server['my_table']
    return [row for row in db.query(byTag, key = tag)]

La función de mapa byTag devuelve los datos con cada etiqueta única en la clave " ;, " ;, luego cada publicación con esa etiqueta en valor , por lo que al agarrar la tecla = " mytag " ;, recuperar todas las publicaciones con la etiqueta "mytag".

Lo he probado con aproximadamente 10 entradas y parece que toma alrededor de 0,0025 segundos por consulta, no estoy seguro de qué tan eficiente es con grandes conjuntos de datos ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top