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

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.

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.


em 19/4/2007 16:22 - Responder

Glaucio Guerraem 8/5/2007 05:54 - Responder


em 6/4/2007 11:05 - Responder

Glaucio Guerraem 8/5/2007 05:59 - Responder


em 17/7/2007 17:13 - Responder


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 Carmoem 4/3/2011 10:28 - Responder

Maviael Rodrigues De Oliveiraem 9/5/2011 11:19 - Responder

Dyego Souza Do Carmoem 10/5/2011 13:30 - Responder

SolangeEstou 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

SolangeConsegui 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 CarmoVoce 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

SolangeComo 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

SolangeMas 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 Carmoem 27/6/2011 16:38 - Responder

SolangePreciso 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 Carmoem 3/7/2011 16:18 - Responder

SolangeObrigado 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

SolangeEu 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 Schulzem 17/8/2011 06:47 - Responder
Devmedia - Equipe De Moderacaoem 17/8/2011 16:30 - Responder


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
Space do autor

Estudo comparativo entre banco de dados IBM Informix e Microsoft SQL

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