2010-09-15 9 views
5

Je souhaite effectuer une condition LIKE (syntaxe SQL) dans CouchDB. Comment cela peut-il être fait? La condition LIKE sera utilisée pour effectuer l'auto-complétion dans le navigateur. Je veux écrire "co" dans le champ de saisie et obtenir les résultats Coffee, Couch, CouchDB ect.Condition similaire dans CouchDB

Répondre

9

Il est très facile de rechercher des lettres au début d'une chaîne. Vous avez juste besoin d'une vue qui émet la chaîne que vous voulez rechercher en tant que clé. En supposant que l'entrée utilisateur est stockée dans une variable q, vous appelez cette vue avec les paramètres startkey=q et endkey=q+"\ufff0".

L'astuce ici consiste à ajouter le caractère Unicode le plus élevé possible à la chaîne de recherche. Dans l'ordre de tri, cette chaîne vient après toute autre chose en commençant par q. (Ceci est beaucoup plus facile à implémenter que la solution suggérée par @titanoboa, où vous devez "incrémenter" la dernière lettre de l'entrée de l'utilisateur.)

Si vous voulez aussi pouvoir trouver des mots au milieu d'un chaîne (par exemple, « The Colbert Report » en tapant « co »), vous pouvez utiliser une vue comme ceci:

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); 
    } 
    } 
} 

Bien sûr, cela ne convient pour les chaînes courtes. Pour rechercher dans des textes plus longs, vous devriez regarder dans un module de recherche de texte intégral comme couchdb-lucene.

+0

Pourquoi le caractère Unicode le plus élevé est-il 'fff0' et non' ffff'? – Jez

+0

@Jez C'est une bonne question, je ne sais pas pourquoi j'ai écrit '\ ufff0' à l'époque. Je suppose que le point de code correct serait '\ u {10FFFF}', mais je n'ai pas testé cela. (https://en.wikipedia.org/wiki/UTF-8#Description) –

0

Cela ne fonctionnera pas avec CouchDB seul. La meilleure chose à essayer est le moteur de recherche Lucene qui fonctionne bien avec CouchDB. Lucene est conçu pour la recherche en texte intégral, ce que vous recherchez essentiellement. Here sont quelques instructions sur la combinaison.

0

Pour implémenter votre exemple, vous pouvez créer une vue dont le champ est une clé et le même champ, le document entier ou ce que vous voulez en tant que valeur. Si vous interrogez la vue avec les paramètres startkey="co", endkey="cp", inclusive_end=false, vous obtiendrez toutes les entrées avec une clé commençant par "co".

Bien sûr, c'est moins puissant que 'LIKE'.