2009-07-29 15 views
17

? Me gustaría utilizar CouchDB para almacenar algunos datos para mí y luego usar llamadas REST completas para obtener los datos que necesito. Mi base de datos se llama "prueba" y todos mis documentos tienen una estructura similar y ser algo como esto (donde hola_mundo es el ID de documento):¿Cómo realizo una consulta parametrizada en CouchDB

"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 ser capaz de hacer es tener mis usuarios envíe una consulta como: "Dame todos los documentos que contienen las palabras 'hola mundo', por ejemplo. He estado jugando con las vistas, pero parece que solo me permitirán mover uno o más de esos valores en . la parte "clave" de la función de mapa que me da la capacidad de hacer algo como esto:

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

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

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

A continuación, utilice el parámetro "hola mundo" en el mapa de puntos de vista/Reducir funciones para encontrar toda la documentos que contienen tanto "hello" como "world" en el conjunto de etiquetas. ¿Es esto posible incluso con CouchDB? ¿Hay alguna otra forma de lograr esto dentro de una vista en la que no estoy pensando?

Respuesta

19

Las vistas de CouchDB no son compatibles con la búsqueda facetada o la búsqueda de texto completo o la intersección de resultados. El plugin couchdb-lucene te permite hacer todo esto.

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

+0

¿Desea elaborar o proporcionar ejemplos? –

+6

Es uno de los desarrolladores del proyecto: "No puedes hacerlo, pero este proyecto te permitirá". Esa es una muy buena respuesta. – dnolen

2

Técnicamente esto es posible si se emiten para cada documento cada conjunto de la powerset de las etiquetas del documento como la clave. El elemento del conjunto de claves debe pedirse y su consulta también debe consultar las etiquetas solicitadas.

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 doc {"hello_world" : {"id":123, "tags":["hello", "world"], "text":"Hello World"} este emitiría:

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

Aunque es posible esto me parece que es una solución bastante arkward. No quiero imaginar el uso del disco de la vista para un mayor número de etiquetas. Espero que el número de claves emitidas crezca como 2^n.

+2

esto no es recomendable. El rendimiento sufrirá mucho y, como mencionaste, el almacenamiento de los índices crecerá sin control. couchdb-lucene mencionado anteriormente es la forma correcta de hacer lo que él quiere. –

Cuestiones relacionadas