Alta performance na indexação com Apache Lucene – Parte II

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (2)  (0)

O Lucene é um recurso que oferece dois tipos principais de serviço: indexação e pesquisa de texto...

O Lucene é um recurso que oferece dois tipos principais de serviço: indexação e pesquisa de texto e, como visto no artigo anterior, tem habilidades para criar e armazenar informações em um índice. Na parte I o índice foi criado, agora, em continuidade, será realizado nele uma pesquisa, feita através de uma query (ou TermQuery, como veremos mais adiante). Para isso, é preciso empregar as classes IndexSearcher, que recebe um Directory como parâmetro para identificar a localização física do índice. O processo se dá com a query passada por parâmetro para o IndexSearcher, que por sua vez retorna um objeto do tipo Hits – coleção de Documents usada para manipular o resultado da busca.

Confira o código de exemplo:

IndexSearcher reader = new IndexSearcher(directory);

            Hits hits = reader.search(new TermQuery(new Term ("conteudo","easy")));

            System.out.println ("Pesquisando palavra easy...");

            System.out.println ("Numero de ocorrencias: " + hits.length());

            Iterator<Hit> i = hits.iterator();

            while (i.hasNext()){

                  Hit hit = i.next();

                  System.out.println ("Score: ");

                  System.out.println (hit.getScore());

                  Document d =(Document) hit.getDocument();

                  System.out.println ("Nome do arquivo indexado: ");

                  System.out.println (d.get("arquivo"));

                 

            }

            reader.close();

Saída:
Pesquisando palavra easy...
Numero de ocorrencias: 1
Score:
0.033562027
Nome do arquivo indexado:
c:/arquivo.txt

Na segunda linha é feita a query através da TermQuery. Esta classe recebe como parâmetro um Term, que representa uma palavra do texto indexado. Trata-se de uma unidade de pesquisa que compõe dois itens, um representa o Field de um Document e o outro o texto a ser pesquisado. No exemplo acima, a string conteúdo é o nome do Field e easy é o texto a ser procurado no índice.

A função lenght() da Classe Hits retorna o número de ocorrências da palavra easy no índice.  Em seguida foi feita a interação recuperando os Documents para exibir as informações na tela. O score é o valor de relevância do document, sendo calculado por uma fórmula para cada Document.

Excluindo Documents do Índice
A exclusão de documentos pode ser feita através do IndexReader, classe utilizada para acessar um índice já existente. IndexReader é uma classe abstrata, portanto não podemos instancia-la diretamente. Utilizaremos a função IndexReader.open( Directory directory) para criar uma classe concreta de IndexReader.

Os Documents existentes no índice podem ser acessados através de um inteiro, mas esse número pode mudar futuramente. Para a exclusão do Document, foi escolhido o método deleteDocuments utilizando um Term para localizar o documento a ser excluído. Abaixo segue um exemplo:

package info.glaucioguerra.main;

import org.apache.lucene.index.IndexReader;

import org.apache.lucene.index.Term;

import org.apache.lucene.store.Directory;

import org.apache.lucene.store.FSDirectory;

public class Main {

      public static void main (String[]args) throws Exception{

            Directory directory = FSDirectory.getDirectory("c:/indice", false);

            IndexReader editar = IndexReader.open(directory);

            editar.deleteDocuments(new Term ("conteudo","easy"));     

            editar.close();

      }

}

Neste código foram excluídos todos os Documents que possuem um Field de nome conteúdo com o texto easy.

Atualizando o Índice
Para a atualização do índice no Lucene não existe uma função que faça um update em um Document. É necessário excluir o Document e indexar o documento novamente.

Ferramentas de visualização de índice
Existem algumas ferramentas que auxiliam a visualização do índice do Lucene.  Uma delas é a Limo, com interface web para navegação do índice. No entanto, vale lembrar que existem algumas limitações comparadas com a Luke.

A Limo pode ser baixada em http://limo.sourceforge.net e a Luke em http://www.getopt.org/luke.  Neste artigo vamos trabalhar com o Luke. Baixe o arquivo lukeall.jar e execute com um duplo clique. Na tela inicial, escolha o diretório onde foi criado o índice (no nosso exemplo foi em c:\indice).

ggapialpart2fig01.jpg

No canto esquerdo da figura ilustrativa são exibidos os Fields que foram armazenados no dado exemplo. Na aba Overview é listado um resumo do índice, com a quantidade de fields, documents, documents excluídos etc. 

ggapialpart2fig02.jpg

Na aba Documents é possível navegar nos terms dos Documents, efetuar exclusão, exibir o conteúdo dos documentos, entre outros recursos.

ggapialpart2fig03.jpg

Referências

http://lucene.apache.org/java - Página inicial do Lucene
http://www.apache.org/dyn/closer.cgi/jakarta/lucene/binaries/

API do lucene (juntamente com os binaries)
http://lucene.apache.org/java/docs/index.html

Caça palavras com Lucene – apresentação conexão java 2005.
http://www.informit.com/articles/article.asp?p=461633&rl=1

Assim sendo, através dos exemplos estudados, pode-se concluir que o Lucene é uma excelente ferramenta para indexação, já que oferece um ótimo desempenho facilitando a busca de documentos de forma simples e rápida.

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?