Alta performance na indexação com Apache Lucene – Parte II
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 neste link e a Luke aqui. 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).
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.
Na aba Documents é possível navegar nos terms dos Documents, efetuar exclusão, exibir o conteúdo dos documentos, entre outros recursos.
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.
Referências:
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo