CouchDB Lucene – Buscas Full-text no CouchDB

O CouchDB Lucene provê a funcionalidade de realizar buscas full-text no CouchDB utilizando Lucene.

Antes de começar precisamos instalar as dependências, só lembrando que esse tutorial foi testado nas versões 10.04 e 9.10 do Ubuntu Linux, mas a princípio o procedimento de instalação para Mac deve ser parecido.
No Ubuntu 10.04 os pacotes sun-java6 foram removidos da seção Multiverse do Ubuntu archive, então você precisa adicionar o repositório Partner da Canonical.

sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"

Então você pode instalar o JDK e o JRE:

sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk

Para instalar o CouchDB Lucene é preciso que você tenha o Git e o Maven instalados:

sudo apt-get install git-core maven2

Finalmente para instalar o CouchDB Lucene é necessário clonar o repositório:

git clone git://github.com/rnewson/couchdb-lucene.git

No caso, hoje a versão estável é a 0.5.3, então vamos dar o build:

cd couchdb-lucene
git checkout v0.5.3
mvn

Configurando o CouchDB
Agora vamos configurar o CouchDB editando o arquivo de configuração que geralmente está localizado em /usr/local/etc/couchdb/local.ini

[couchdb]
os_process_timeout=60000 ; aumenta o timeout para 5 segundos

[external]
fti=/path/do/python /path/para/couchdb-lucene/tools/couchdb-external-hook.py ; geralmente /usr/bin/python

[httpd_db_handlers]
_fti = {couch_httpd_external, handle_external_req, <<"fti">>}

Agora vamos criar uma view de exemplo, supondo que temos um design document de Posts

{
    "_id": "_design/Post",
    "fulltext": {
        "by_title": {
            "index": "
            function(doc) { 
                if(doc['couchrest-type'] == 'Post') {
                    var ret=new Document(); 
                    ret.add(doc.title); 
                    return ret; 
                }
            }"
        }
    }
}

Pronto, você pode realizar buscas full-text no CouchDB utilizando Lucene:

curl http://localhost:5984/nome_banco/_fti/_design/Post/by_title?q=titulo_do_post