26 de outubro de 2011

Lucene, o motor de busca textual

Lucene é um framework de alto desempenho para busca textual feito em Java. Uma das características marcantes dele é a integração com Hadoop, um framework para computação distribuida, que possui, dentre outros, um MapReduce e um sistema de arquivos distribuido HDFS.

Imagine o seguinte cenário: Seu usuário deseja criar um modulo de gerenciamento de artigos e também expó-los na Internet. As informações do artigo são: título, autor e o contéudo. Normalmente cada artigo desses contém cerca de 1500 palavras e o usuário poderá buscar pelo conteudo desses artigos. Suponha que há 1 milhão e meio de artigos para serem cadastrados, o simples uso de um banco de dados e o operador LIKE '%palavra%' é inviável. E aí que entra um bom framework de busca textual, usá-lo passa ser a solução mais tranquila e viável. Além de trazer velocidade, também traz outras características nas buscas que dificilmente fariamos codificando tudo do zero.

Há vários termos usados na terminologia do framework, os principais são: Documento, Campo, Directório, Indexador, Pesquisador, Analisador e Termo.

Documento - é o conjunto de dados que você deseja indexar, por ex. título, conteudo e autor formam o documento artigo, pode ser visto como um objecto no lucene é visto como Document.

Campo - é o dado, identificado, que pode ser analogo a um campo de uma tabela ou uma propriedade de um objecto no lucene é visto como Field.

Directório - conceito abstrato que denota um local para guardar os índices no lucene é visto como uma interface Directory, que possui diversas implementações DbDirectory, FSDirectory, JEDirectory, RAMDirectory.

Indexador - é o responsável por indexar os documentos num directorio no lucene é visto, geralmente, como IndexWriter.c

Pesquisador - responsável por pesquisar uma Query no diretorio de índices, no lucene é visto como Searcher.

Analisador - actua como um filtro e faz uma pré-avaliação do que pode ser indexado ou não, no lucene há uma lista de vários analisadores.

Termo - pode ser visto como objecto que pode ser usado como parametro da pesquisa, composto pelo nome do campo e o valor a ser pesquisado, no lucene é visto como Term.

Quando se faz uma pesquisa por documentos no Lucene podemos utilizar de alguns operadores (+, -, AND, NOT, OR, * e etc.) juntamente com o termo pesquisado ou apenas pesquisar uma frase completa.
Exemplo : termo
Consequência: Irá pesquisar a palavra "termo" nos documentos indexados.

Exemplo : termo OR palavra ( == termo palavra)
Consequência: Irá pesquisar "termo" ou "palavra" nos documentos indexados.

Exemplo : +termo +palavra ( == termo AND palavra)
Consequência: Irá pesquisar "termo" e "palavra" nos documentos indexados.

Exemplo : campo:termo
Consequência: Irá pesquisar "termo" no campo "campo" nos documentos indexados.

Exemplo : +manutd +java -manager
Consequência: Irá pesquisar documentos que contenham manutd e java e não tenha manager.

Exemplo : "termo exacto"
Consequência: Irá pesquisar documentos que contenham exactamente "termo exacto".

Exemplo : java*
Consequência: Irá pesquisar documentos que contenham palavras que começem com java (javadb, javanet...).

Exemplo : java~
Consequência: Irá pesquisar documentos que contenham palavras similares a java como por ex. lava, jaba...