Obrigado por visitar a devmedia.com.br!

Precisamos de você para divulgar nossos vídeos e cursos gratuitos para a comunidade.

Se você gosta da devmedia.com.br por favor dê-nos o seu clique para o Google+ e ajude outros desenvolvedores ao redor do mundo.



Obrigado por seu apoio!
Equipe DevMedia

sair sem compartilhar (x)
DevMedia - asp.net, Java, Delphi, SQL e web Design, tudo em um só lugar!
Bem vindo a DevMedia!
LOGIN:     SENHA:

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





    23 COMENTÁRIOS

[Fechar]

Este post é fechado - você precisa ter acesso ao post para incluir um comentário.



Vinicius
Olá amigo, estou começamdo agora em java e resolvi colocar esse seu código para testar, só que quando coloquei a linha: "IteratorHit> i = hits.iterator();" dá um erro em Iterator dizendo:"invalid expression as statement". O que faço para resolver esse problema?


em 19/4/2007 16:22 - Responder

 

  Glaucio Guerra
Olá Vinicius. Qual a versão do seu JDK? Baixe a versão 5 que eu acredito que vá funcionar! Um abraço!


em 8/5/2007 05:54 - Responder
 

Jardel
estou fazendo uma busca parecida e não estou obtendo resultado algum. Uma das diferenças é o parametro directory. No lugar do directory criei uma string com o nome de indice e atribui a ela o local do indice. Queria saber se existe alguma diferença? e se pode ser isso o pq de não obter resultado algum?


em 6/4/2007 11:05 - Responder

 

  Glaucio Guerra
Olá Jardel, Você deve utilizar o Directory pois sem ele não é possivel fazer a busca através do IndexReader. O IndexReader recebe como parâmetro no construtor um Directory e por isso a utilização dele para a busca é fundamental


em 8/5/2007 05:59 - Responder
 

Oelison Sosua
Olá, tentei rodar o exemplo postado no site e quando eu troco o criterio de busca para uma que tenhas mais de 1 ocorrenica, a pesquisa retorna somente 1


em 17/7/2007 17:13 - Responder

 

Mikaelly Barbosa De Araujo
Opa! ótimo exemplo sobre o lucene!
porem testei um modelo igual ao que vc fez, até na parte de indexar funciona sem erros, mas para pesquisa ele da o seguitne erro:

Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - cannot find symbol
symbol: variable directory

aparentemente com o parametro 'directory' nessa linha:
IndexSearcher reader = new IndexSearcher(directory);

sabe o pq desse erro?

abraço!


em 24/2/2011 11:55 - Responder

 

  Dyego Souza Do Carmo
substitua o "directory" pelo nome do diretorio que contem os arquivos de indices do LUCENE , vai funcionar :)


em 4/3/2011 10:28 - Responder
 

  Maviael Rodrigues De Oliveira
Estou precisando de uma ajuda. Tenho q fazer uma busca para procurar palavras (ou frase) dentro de PDFs e mostrar na tela um trecho do texto onde contem a palavra digitada. Com o Lucene, ja consigo indexar os arquivos pdfs e pesquisar, mas n consigo extrair o trecho do texto que preciso. alguem pode me ajudar?


em 9/5/2011 11:19 - Responder
 

  Dyego Souza Do Carmo
Use a biblioteca itext para ler os pdfs e use o Apache Lucene para indexa-los :)


em 10/5/2011 13:30 - Responder
 

  Solange
Olá Pessoal;

Estou precisando fazer o seguinte: eu tenho a palavra "X" e preciso verificar se ela esta em um arquivo TXT ou XML, mas o arquivo é de 900MB o que esta levando um tempo inviável utilizando outras bibliotecas.

No entanto, me indicarem o Lucene para indexar os conteúdo e fazer a busca pelas palavras, mas ao utilizar o exemplo descrito no artigo, não ocorreu erro algum, mas também não tive nenhum resultado, ou seja, ele executa corretamente mas não indexa nada.

Poderiam me ajudar?

Abraços
Solange


em 15/6/2011 21:42 - Responder
 

  Solange
Olá Pessoal;

Consegui resolver, mas agora estou com outro problema.

Eu só consigo localizar palavras que estejam no inicio ou no final das linhas, vocês sabem me dizer o porque?
É a primeira vez que estou trabalhando com Lucene.

Abraços
Solange


em 16/6/2011 16:39 - Responder
 

  Dyego Souza Do Carmo
Opa !

Voce configurou pelo tool bar a indexação de todas as palavras ? Por padrao o Lucene não indexa 100% todo texto por questoes de performance.


em 17/6/2011 09:07 - Responder
 

  Solange
Olá Dyego;

Como assim tool bar? Desculpe, mas é que ainda não tenho muito conhecimento sobre a biblioteca.

Obrigada pela ajuda;

Abraços
Solange


em 17/6/2011 11:22 - Responder
 

  Solange
Bom Pessoal, consegui.
Mas encontrei mais um problema, pelo que entendi o Lucene não localiza caracteres e nem pontuação.

Abraços


em 19/6/2011 20:54 - Responder
 

  Dyego Souza Do Carmo
Você precisa utilizar o provider para Portugues do Brasil , ou seja , latin1 !


em 27/6/2011 16:38 - Responder
 

  Solange
Olá Pessoal;

Preciso de mais uma ajuda com a Lucene. Eu queria indexar os termos academia, e depois se eu realizar uma busca por academ não localizar. Mas o lucene faz isso, eu envio o termo academia e ele indexa acad, acade, academ e academia.

Tenho como reverter isso, e indexar somente o termo passado para indexação??

Abraços


em 28/6/2011 17:12 - Responder
 

  Dyego Souza Do Carmo
Ele indexa para ficar mais facil de localizar por parciais, este comportamento esta tendo algum edfeito colateral ?


em 3/7/2011 16:18 - Responder
 

  Solange
Olá Pessoal;

Obrigado pela ajuda.
Agora estou com outra duvida. O texto que estou indexando tem 3 vezes a palavras "Fisica", e eu gostaria de indexar esta palavras 3 vezes, ou seja, o número de vezes que ela ocorre dentro do texto.
Eu percebi que o lucene desconsidera palavras repetidas, ou seja, ele indexa somente uma vez. Teria como eu fazer isso?
Abraços
Solange


em 5/8/2011 17:17 - Responder
 

  Solange
Sim Dyego;

Eu gostaria que ele indexasse somente os tokens, por exemplo, se for "aluguel", que ele indexasse somente "aluguel". Mas ele esta criando vários indices, por exemplo, alu, alugu, aluguel.
Será que tem como indexar somente o token. Estou passando a ele um arquivo .xml, então não tenho como passar o token entre aspas que poderia de repente resovler este problema.

Abraços
Solange


em 8/8/2011 10:05 - Responder
 

  William Schulz
amigo, eu gostaria de saber se tem como eu eu extrair o texto de um arquivo pdf e ja retornar ele diretamente pra mim slvo em um arquivo texto, sem me importar com questao de otimizacao de palavras, apenas eu ter acesso ao texto e poder manipular de acordo com outros objetivos


em 17/8/2011 06:47 - Responder
 

  Devmedia - Equipe De Moderacao
William, não entendemos a sua dúvida, poderia explicá-la melhor??


em 17/8/2011 16:30 - Responder
 

Douglas Felipe Pereira
Olá pessoal...

Eu venho trabalhando há algum tempo com o Lucene na faculdade. Minha dúvida é a seguinte:
Eu tenho um índice e preciso recuperar de determinado campo, a quantidade de ocorrência de cada palavra no campo. Ou seja, tenho um campo "Tipo_de_Animal" preciso pegar a lista de palavras e a quantidade:

"Mamífero 10"
"Aves 20"
"Anfíbio 5"

e assim por diante... alguém poderia ajudar?


em 12/1/2012 03:17 - Responder

 

  Dyego Souza Do Carmo
Chegou a usar o Hibernate Search para isto ?


em 24/1/2012 15:07 - Responder
 



Autor
Glaucio Guerra

Há cinco anos atuando com desenvolvimento de software, Glaucio Guerra (glaucioguerra@gmail.com) trabalha como Analista de Sistemas no ambiente Petrobras, no Rio de Janeiro, sendo bacharelando em Ciência da Computação. Atualmente, concentra seus projetos com foco em aplicações JEE voltadas para o ger...


Space do autor
Estatísticas
Favorito:
Comentários:
Feedback:
Utilidade:
1   0
[Fechar]

Você precisa estar logado para dar um feedback.

Clique aqui para efetuar o login
[Fechar]
Este post está disponível para assinantes da Java Magazine ou para quem possui Créditos DevMedia.

  Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!

Plano conveniência – Neste plano este post custa R$ 0,00 (Compre agora)
Esse plano permite que você compre somente um post, pagando por ele seu preço sem desconto.

Plano ocasional: Aqui este post custa: R$ -1,00 (assinante) ou R$ -1,00 (não-assinante)
Este plano é ideal para quem tem interesse em mais de um post. Você compra um mínimo de R$ 50,00 em créditos e ganha, em média, 50% de desconto no preço do post. Compre Créditos agora!

Assinatura de Créditos (Plano econômico) – Aqui este post custa R$ -1,00
Este plano é ideal para quem tem interesse em muitos posts. Com esse plano você compra R$ 180,00 em créditos e ganha, em média, 80% de desconto no preço do post. Assine este plano agora!

> Saiba mais sobre o Sistema de Créditos DevMedia
web-03
DevMedia  |  Anuncie  |  Fale conosco
Hospedagem web por Porta 80 Web Hosting
2012 - Todos os Direitos Reservados a web-03