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).

Resumo do índice, com a quantidade de fields, documents, documents excluídos etc.

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.

Aba Overview

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

Aba Documents

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: