ventajas tutorial support requerimientos end desventajas couchdb

tutorial - ¿Cómo realizo una consulta parametrizada en CouchDB?



couchdb vs mongodb (2)

Las vistas de CouchDB no admiten la búsqueda facetada o la búsqueda de texto completo o la intersección de resultados. El plugin couchdb-lucene te permite hacer todas estas cosas.

http://github.com/rnewson/couchdb-lucene/tree/master

Me gustaría usar CouchDB para almacenar algunos datos para mí y luego usar RESTful api calls para obtener los datos que necesito. Mi base de datos se llama "prueba" y todos mis documentos tienen una estructura similar y se parecen a esto (donde hello_world es el ID del documento):

"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} "foo_bar" :{"id":124, "tags":["foo", "bar"], "text":"Foo Bar"}

Lo que me gustaría poder hacer es que mis usuarios envíen una consulta como: "Dame todos los documentos que contengan las palabras" hola mundo ", por ejemplo. He estado jugando con vistas pero parece que solo me permitirán mover uno o más de esos valores a la parte "clave" de la función de mapa. Eso me permite hacer algo como esto:

http://localhost:5984/test/_design/search/_view/search_view?key= "hello"

Pero esto no me permite permitir que mis usuarios especifiquen su cadena de consulta. Por ejemplo, qué tal si buscaran "hola mundo". Tendría que hacer dos consultas: una para "hola" y otra para "world", luego tendría que escribir un montón de javascript para combinar los resultados, eliminar duplicados, etc. (¡YUCK!). Lo que realmente quiero es poder hacer algo como esto:

http://localhost:5984/test/_design/search/_view/search_view?term= "hola mundo"

Luego use el parámetro "hola mundo" en las funciones de mapa de vistas / reducción para encontrar todos los documentos que contienen tanto "hola" como "mundo" en la matriz de etiquetas. ¿Es este tipo de cosas incluso posible con CouchDB? ¿Hay otra manera de lograr esto dentro de una vista que no estoy pensando?


Técnicamente, esto es posible si emite para cada documento cada conjunto del conjunto de potencias de las etiquetas del documento como la clave. El elemento de conjunto de claves debe ordenarse y su consulta también debe consultar las etiquetas ordenadas.

function map(doc) { function powerset(array) { ... } powerset_of_tags = powerset(doc.tags) for(i in powerset_of_tags) { emit(powerset_of_tags[i], doc); } }

para el documento {"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} esto emitirá:

{ key: [], doc: ... } { key: [''hello''], doc: ... } { key: [''world''], doc: ... } { key: [''hello'', ''world''], doc: ... }

Aunque es esto posible, consideraría esto como una solución bastante complicada. No quiero imaginar el uso del disco de la vista para un mayor número de etiquetas. Espero que la cantidad de claves emitidas crezca como 2 ^ n.