views:

104

answers:

3

I want to perform a LIKE-condition (SQL syntax) in CouchDB. How can this be done? The LIKE-condition will be used to perform auto complete in the browser.

I want to write "co" in the input field and get the results Coffee, Couch, CouchDB ect.

A: 

That won't work with CouchDB alone. The best thing to try is the Lucene search engine which works well with CouchDB. Lucene is designed for full-text searching which is basically what you are looking for. Here are some instructions on the combination.

Tomas
+1  A: 

To implement your example, you could create a view which has your field as a key and the same field, the whole document or whatever you want as a value. If you query the view with the parameters startkey="co", endkey="cp", inclusive_end=false, you'll get all entries with a key that starts with "co".

Of course, this is less powerful than 'LIKE'.

titanoboa
+2  A: 

It is very easy to search for letters at the beginning of a string. You just need a view that emits the string you want to search for as the key. Assuming the user input is stored in a variable q, you then call that view with the parameters startkey=q and endkey=q+"\ufff0".

The trick here is to append the highest possible Unicode character to the search string. In the sort order, this string comes after anything else starting with q. (This is much easier to implement than the solution suggested by @titanoboa, where you need to "increment" the last letter of the user input.)

If you also want to be able to find words in the middle of a string (e.g. "The Colbert Report" when typing "co"), you could use a view like this:

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

Of course this is only advisable for short strings. For searching in longer texts you should look into a full-text search add-on like couchdb-lucene.

Christian Berg