Domanda

Vorrei utilizzare CouchDB per memorizzare alcuni dati per me e quindi utilizzare le chiamate API RESTful per ottenere i dati di cui ho bisogno. Il mio database si chiama " test " e tutti i miei documenti hanno una struttura simile e assomigliano a questo (dove hello_world è l'ID del documento):

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

Quello che mi piacerebbe poter fare è chiedere ai miei utenti di inviare una query come: " Dammi tutti i documenti che contengono le parole "ciao mondo", per esempio. Ho giocato con le viste ma sembra che mi permetteranno solo di spostare uno o più di questi valori nella "chiave" parte della funzione mappa. Questo mi dà la possibilità di fare qualcosa del genere:

  

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

Ma questo non mi consente di consentire ai miei utenti di specificare la loro stringa di query. Ad esempio, se avessero cercato "ciao mondo". Dovrei fare due domande: una per "ciao" e uno per "mondo" quindi dovrei scrivere un sacco di javascript per combinare i risultati, rimuovere i duplicati, ecc. (YUCK!). Quello che voglio davvero è essere in grado di fare qualcosa del genere:

  

http: // localhost: 5984 / test / _design / search / _view / search_view? term = " ciao mondo "

Quindi utilizza il parametro " hello world " nelle viste mappa / riduci le funzioni per trovare tutti i documenti che contengono sia "ciao" e "mondo" nella matrice dei tag. Questo genere di cose è possibile anche con CouchDB? C'è un altro modo per ottenere questo risultato in una visione a cui non sto pensando?

È stato utile?

Soluzione

Le viste CouchDB non supportano la ricerca sfaccettata o la ricerca full-text o l'intersezione dei risultati. Il plugin couchdb-lucene ti consente di fare tutte queste cose.

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

Altri suggerimenti

Tecnicamente questo è possibile se si emette per ciascun documento ogni serie del powerset dei tag del documento come chiave. L'elemento del set di chiavi deve essere ordinato e anche la tua query dovrebbe richiedere i tag ordinati.

function map(doc) {
  function powerset(array) { ... }

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

per il documento {" hello_world " : {" id ": 123, " tags ": [" hello " ;, " world "], " text ": " Hello World "} questo emetterebbe:

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

Anche se è possibile, la considero una soluzione piuttosto complicata. Non voglio immaginare l'uso del disco della vista per un numero maggiore di tag. Mi aspetto che il numero di chiavi emesse cresca come 2 ^ n.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top