2009-07-29 13 views
17

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 è chiamato "test" ed i miei documenti tutti hanno una struttura simile e simile a questa (dove hello_world è l'ID del documento):Come eseguire una query con parametri su CouchDB

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

Quello che mi piacerebbe essere in grado di fare è avere i miei utenti invia una query del tipo: "Dammi tutti i documenti che contengono le parole" ciao mondo ", ad esempio. Ho giocato con le visualizzazioni ma sembra che mi consentano solo di spostare uno o più di quei valori in . la parte "chiave" della funzione di carta che mi dà la possibilità di fare qualcosa di simile:

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

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

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

quindi utilizzare il parametro "ciao mondo" nella vista mappa/ridurre funzioni per trovare tutte le documenti che contengono sia "ciao" che "mondo" nell'array dei tag. Questo tipo di cose è persino possibile con CouchDB? C'è un altro modo per realizzare questo all'interno di una visione che non sto pensando?

risposta

19

Visualizzazioni CouchDB non supportano ricerca sfaccettata o ricerca testo completo o intersezione di risultati. Il plugin couchdb-lucene ti consente di fare tutte queste cose.

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

+0

Cura di elaborare o fornire esempi? –

+6

È uno degli sviluppatori del progetto: "Non puoi farlo, ma questo progetto ti permetterà". Questa è una buona risposta. – dnolen

2

Tecnicamente questo è possibile se si emettono per ogni documento ogni set del Powerset dei tag del documento come la chiave. L'elemento del set di chiavi deve essere ordinato e anche la query deve interrogare 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 doc {"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 questo è possibile vorrei considerare questa una soluzione piuttosto arkward. Non voglio immaginare l'utilizzo del disco della vista per un numero maggiore di tag. Mi aspetto che il numero di chiavi emesse cresca come 2^n.

+2

questo non è raccomandato. Le prestazioni risentiranno molto e, come hai detto, lo spazio per gli indici crescerà senza controllo. couchdb-lucene menzionato sopra è il modo corretto di fare ciò che vuole. –

Problemi correlati