2010-09-15 3 views
5

Desidero eseguire una condizione LIKE (sintassi SQL) in CouchDB. Come si può fare? La condizione LIKE verrà utilizzata per eseguire il completamento automatico nel browser.Condizioni simili nel CouchDB

Voglio scrivere "co" nel campo di inserimento e ottenere i risultati Coffee, Couch, CouchDB ect.

risposta

9

È molto semplice cercare lettere all'inizio di una stringa. Hai solo bisogno di una vista che emetta la stringa che desideri cercare come chiave. Supponendo che l'input dell'utente sia memorizzato in una variabile q, si chiama questa vista con i parametri startkey=q e endkey=q+"\ufff0".

Il trucco qui è di aggiungere il più alto carattere Unicode possibile alla stringa di ricerca. Nell'ordine, questa stringa viene dopo qualsiasi altra cosa che inizia con q. (Questo è molto più semplice da implementare rispetto alla soluzione suggerita da @titanoboa, dove è necessario "incrementare" l'ultima lettera dell'input dell'utente.)

Se si desidera poter trovare le parole nel mezzo di un stringa (ad esempio, "The Colbert report" durante la digitazione di "co"), è possibile utilizzare una vista come questa:

function(doc) { 
    if (doc.title) { 
    var words = {}; 
    doc.title.replace(/\w+/g, function(word) { 
     words[word.toLowerCase()] = true; 
    }); 
    for (w in words) { 
     emit(w, doc); 
    } 
    } 
} 

Naturalmente questo è consigliabile solo per brevi stringhe. Per la ricerca in testi più lunghi dovresti cercare in un componente aggiuntivo di ricerca full-text come couchdb-lucene.

+0

Perché il carattere Unicode più alto possibile è 'fff0' e non' ffff'? – Jez

+0

@Jez Questa è una buona domanda, non ho idea del motivo per cui ho scritto '\ ufff0' allora. Suppongo che il punto di codice corretto sarebbe '\ u {10FFFF}', ma non ho provato questo. (Https://en.wikipedia.org/wiki/UTF-8#Description) –

0

Questo non funziona con CouchDB da solo. La cosa migliore da provare è il motore di ricerca Lucene che funziona bene con CouchDB. Lucene è progettato per la ricerca full-text che è fondamentalmente ciò che stai cercando. Here sono alcune istruzioni sulla combinazione.

0

Per implementare il tuo esempio, puoi creare una vista che ha il tuo campo come chiave e lo stesso campo, l'intero documento o qualsiasi cosa tu voglia come valore. Se si interroga la vista con i parametri startkey="co", endkey="cp", inclusive_end=false, si ottengono tutte le voci con una chiave che inizia con "co".

Ovviamente, questo è meno potente di "LIKE".