¿Hay alguna forma de tener implementada la búsqueda de etiquetas múltiples en CouchDB? Tengo documentos (publicaciones), cada uno con múltiples etiquetas. Necesito encontrar publicaciones que hayan sido etiquetadas con un conjunto arbitrario de etiquetas. ¿Cómo lo hago? Por supuesto, podría hacerlo con múltiples llamadas a una vista que me da los documentos para una etiqueta y luego ordenarla en mi aplicación, pero quería saber si había una manera de lograr lo mismo en la vista de CouchDB.CouchDB etiquetas múltiples
Respuesta
En las versiones más recientes de CouchDB, puede POSTAR a una vista con un documento JSON llamado keys
, que permite la búsqueda de varias teclas. La estructura sería algo como esto:
{"keys": ["first_tag", "second_tag", "third_tag"]}
Este podrán ser desplazados a una visión que usted tiene que las etiquetas se emiten para sus respectivas llaves.
Esta y otras opciones de consulta están documentadas here.
Una forma de hacerlo es como se explicó anteriormente por Ryan Duffield. Aunque resuelve algunas de las consultas, se volverá inmanejable a lo largo del tiempo. De otra manera es utilizar la búsqueda de texto completo que no es actualmente compatible con CouchDB pero hay un complemento externo usando Lucene. más aquí http://wiki.apache.org/couchdb/Full_text_search.
En realidad, etiquetar parece ser un problema muy relacionado y no funciona bien con el diseño de CouchDB. Así que he decidido tener una pequeña base de datos para etiquetas en mysql y tengo los documentos reales almacenados en CouchDB. Esto me permite obtener lo mejor de ambos mundos. Aunque esta técnica tiene problemas relacionados con la sincronización, la búsqueda en etiquetas es una operación eficiente en sql y el contenido no es demasiado para preocuparse por la replicación o fragmentación. Gracias por todas sus respuestas.
No estoy de acuerdo con esta afirmación; las etiquetas funcionan bastante bien cuando se hace correctamente en CouchDB. Recomendaría echarle un vistazo a algo como Sofa for inspiration: http://github.com/jchris/sofa –
No estoy seguro de por qué esto es downvoted. ER y las consultas relacionadas se resuelven mejor en una base de datos relacional. – Till
Entonces, por lo que yo entendí, la respuesta es NO. CouchDB no puede consultar documentos que tienen presencia de varias etiquetas (la solución temporal con lucene o mysql no cuenta, de esta manera hemos perdido algunas funciones de CouchDB). Noticias tristes :(
. (con presencia de varias etiquetas - teniendo ambos A y B, no A o B)
UPD Es posible, pero con limitaciones a sólo 2-3 etiquetas
!.http://wiki.apache.org/couchdb/EntityRelationship
consulta por varias claves
Algunas aplicaciones necesitan ver la intersección o f entidades que tienen múltiples claves. En el ejemplo anterior, esta sería una consulta para los contactos que están en los grupos "Amigos" y "Colegas". La forma más directa de manejar esta situación es consultar una de las claves y luego filtrar por el resto de las claves del lado del cliente. Si las frecuencias clave varían mucho, también puede valer la pena hacer una llamada inicial para determinar la clave con la frecuencia más baja y usarla para obtener la lista de documentos inicial de la base de datos.
Si esta no es una buena opción, es posible indexar las combinaciones de las teclas, aunque el crecimiento del índice para un documento dado será exponencial con el número de sus claves. Aún así, para juegos de llaves pequeñas, esta es una opción, ya que las llaves se pueden pedir, y las teclas que son prefijos de una clave más grande se pueden omitir.Por ejemplo, para la clave establecida [1 2 3] las posibles combinaciones de teclas son [1] [2] [3] [1 2] [1 3] [2 3] [1 2 3] Sin embargo, el índice solo necesita contener las teclas [3] [1 3] [2 3] [1 2 3] ya que (por ejemplo) los documentos que coinciden con las claves [1 2] podrían obtenerse con una consulta para startkey = [1,2, null] y endkey = [1,2, {}] El número de entradas de índice será 2^(n-1) número de teclas.
Una última opción es usar un índice separado, como couchdb-lucene para ayudar con tales consultas.
Creo que lo siguiente debería darle un algoritmo algo complicado pero sólido, es decir, encuentra los primeros resultados rápidamente, incluso si tiene muchos documentos. Es probable que no tenga un buen rendimiento en la práctica :(
Índice de los documentos por cada etiqueta individual y no Identificación del documento:
[<some tag>, <document id>]
Por ejemplo, para los documentos documentan
- docid1 con las etiquetas [azul , verde, rojo]
- docid2 con las etiquetas [azul, amarillo]
se obtener
['blue', 'docid1'] ['blue', 'docid2'] ['green', 'docid1'] ['red', 'docid1'] ['yellow', 'docid2']
Ahora para cada etiqueta que desea buscar se abre una búsqueda paralela a partir de [tag, ...].
Para cada etiqueta, mantiene una posición de búsqueda actual. Si los docids en todas sus búsquedas coinciden, encontró una coincidencia. Si no coinciden, intente omitir al menos la ID del documento más alta a través de una búsqueda de rango. Repetir.
[Se trata básicamente de una combinación.]
La omisión es teóricamente rápido: Tenemos un índice para encontrar estos documentos. Prácticamente, es probablemente lento debido a todos los viajes redondos al servidor. Sería bueno poder descargar ese algoritmo a una función ejecutada en el servidor. ¿Es eso posible?
He resuelto este problema creando una vista con una función recursiva. Aquí la esencia https://gist.github.com/820412
- 1. CouchDB y claves múltiples
- 2. Múltiples etiquetas PHP
- 3. bases de datos múltiples de couchdb
- 4. Clave compuesta con CouchDB, encontrar registros múltiples
- 5. múltiples <nav> etiquetas
- 6. iOS UIButton con etiquetas múltiples
- 7. Seleccionar fotos por etiquetas múltiples
- 8. Consultas dinámicas complejas en CouchDB
- 9. múltiples rangos de teclado como parámetros a una vista CouchDB
- 10. R - boxplot con etiquetas de factores múltiples
- 11. Múltiples etiquetas h1 en una sola página
- 12. Múltiples etiquetas/carpetas en Google Reader
- 13. etiquetas de script múltiples versus únicas
- 14. Consulta de búsqueda de etiquetas múltiples
- 15. CouchDB autorización
- 16. ¿Mysql join consulta para múltiples "etiquetas" (relación muchos-a-muchos) que coinciden con TODAS las etiquetas?
- 17. de anidamiento múltiples etiquetas div dentro de una etiqueta li
- 18. ¿Puedo tener múltiples etiquetas rel = "alternativas" para una página web?
- 19. ¿Configurar etiquetas múltiples para transparentar a través de 1.000 formularios?
- 20. ¿Usa la misma ID en múltiples etiquetas HTML?
- 21. Recuperación de documento CouchDB múltiple con couchdb-python
- 22. CouchDB Ver equivalente de SUM & GROUP POR
- 23. Atributos personalizados para archivos adjuntos CouchDB
- 24. CouchDB vs HBase
- 25. CouchDB para un foro?
- 26. couchdb - eliminando la revisión
- 27. NoSQL - MongoDB vs CouchDB
- 28. Replicación filtrada de CouchDB
- 29. ¿Usando jquery.couch.js de CouchDB?
- 30. Para CouchDB o no?
No estoy seguro de si esta sería la mejor manera. Supongamos que tengo una lista de 15 etiquetas distintas que podrían aplicarse en cualquier combinación y orden diferentes, entonces tendría 15^14 combinaciones de teclas. Generar e indexar todas estas consultas sería una tarea abrumadora. PS. Las matemáticas no son mi área más fuerte. Corrígeme si estoy equivocado. –
Por supuesto que pueden estar clasificados y no tienes tantas combinaciones. – Luman75
Eso funciona para recuperar todos los documentos que tienen al menos una de las etiquetas en la lista de teclas. Pero, ¿qué sucede si quiere encontrar todos los documentos que tienen TODAS las etiquetas? –