Pregunta

Me gustaría usar CouchDB para almacenar algunos datos para mí y luego usar llamadas API RESTful para obtener los datos que necesito. Mi base de datos se llama " test " y todos mis documentos tienen una estructura similar y se ven más o menos así (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 contienen 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 tecla " porción de la función del mapa. Eso 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é pasaría si buscaran " hello world " ;. Tendría que hacer dos consultas: una para '' hola '' y uno 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 poder hacer algo como esto:

  

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

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

¿Fue útil?

Solución

Las vistas CouchDB no son compatibles con la búsqueda por facetas o la búsqueda de texto completo o intersección de resultados. El complemento couchdb-lucene le permite hacer todas estas cosas.

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

Otros consejos

Técnicamente, esto es posible si emite para cada documento cada conjunto del conjunto de alimentación de las etiquetas del documento como clave. El elemento del conjunto de claves debe estar ordenado y su consulta también deberá 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ía:

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

Aunque es esto posible, consideraría que esta es una solución bastante arca. 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.

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