pace=0 src="/loja/img/capa_java49_G.gif" border=0>

ft-com:office:office" />

Implemente recursos completos de pesquisa te

 

Nos últimos anos, os sites de busca se tornaram onipresentes em nossas vidas, ajudando-nos a lidar com o volume avassalador de informações da web. Essa tecnologia de recuperação de informações tem ganhado espaço também no mundo corporativo, e existem hoje no mercado soluções em software (ex.: Ultraseek, Google Search Services) e em hardware (ex.: Google Mini e Google Search Appliance), que se propõem a pesquisar páginas em intranets e arquivos em diversos formatos.

Para o desenvolvedor Java, existe uma alternativa open source que não deixa nada a dever a essas soluções proprietárias: o Apache Lucene, uma biblioteca de pesquisa textual extremamente poderosa incorporada como projeto da Apache Software Foundation em 2001.

Diversos projetos utilizam o Lucene. Exemplos são o mecanismo de busca web Nutch (um subprojeto do Lucene), o sistema de gerência de conteúdo Open- CMS, o IDE Eclipse (em seu help online) e o Hibernate Search. Veja nos links uma referência para a lista completa de projetos “Powered by Lucene”.

Neste artigo, veremos os conceitos básicos do Apache Lucene e como utilizá-lo através de uma aplicação de exemplo.

 

Lucene numa casca de noz

A pesquisa textual, como sabemos, consiste em localizar documentos que contêm uma determinada palavra ou frase. O termo “documento” é usado neste artigo de maneira ampla, referindo-se a páginas

HTML, arquivos em vários formatos, enfim, a qualquer objeto que possua texto e seja relevante para o usuário.

Um dos conceitos centrais da pesquisa textual é a indexação. De maneira simplificada, indexar é processar os documentos e colocar as suas palavras em estruturas de dados que possam ser pesquisadas rapidamente: os índices. Os índices de pesquisa textual quase sempre são listas invertidas, em que cada palavra é uma chave que aponta os documentos nos quais ocorre. A Figura 1 ilustra esse conceito.

 

img

Figura 1. Esquema simplificado de uma lista invertida.

 

No Lucene, o índice é composto por duas estruturas lógicas principais: documentos e campos (fields). Cada entrada no índice corresponde a um documento (org.apache. lucene.document.Document) e cada documento possui um conjunto de campos (org.apache. lucene.document.Field). Fazendo uma analogia com um banco de dados relacional, os documentos seriam como linhas numa tabela e os campos seriam semelhantes às colunas. Em outras palavras, para cada objeto que podemos pesquisar (um documento) existem diversos atributos pelos quais podemos pesquisar (campos).

Um aspecto importante da pesquisa textual é que normalmente estamos interessados apenas no conteúdo dos documentos e não na sua formatação ou estrutura de arquivo específica. Por exemplo, se tivermos um conjunto de livros sobre Java em formato PDF, não estaremos preocupados com os dados de controle e de formatação contidos nos arquivos, mas com os textos em si. Por isso é preciso extrair o texto de interesse antes de indexá-lo. (O Lucene não inclui ferramentas para fazer a extração de texto. Cabe à aplicação fazer isso antes de usar o Lucene.)

Analisando um pouco mais, veremos que mesmo o conteúdo textual de cada documento não é inteiramente relevante. Por exemplo, palavras muito comuns como “de”, “a” e “o” não precisam ser indexadas, pois ocorrem em praticamente 100% dos documentos em língua portuguesa. Além disso, algumas características da pesquisa, por exemplo discriminar maiúsculas e minúsculas e considerar caracteres acentuados, exigem o tratamento do texto antes da indexação. Este processo é chamado análise e é realizado após a extração do texto. No Lucene, a análise é feita pelas implementações da classe abstrata org. apache.lucene.analysis.Analyzer.

O Lucene fornece uma implementação default bastante razoável para a classe Analyzer, o StandardAnalyzer. Entretanto, para textos em língua portuguesa recomen- damos usar uma implementação específica. Criamos para este artigo a classe PortuguesAnalyzer, que contém uma lista de palavras comuns da nossa língua e pode ser configurada para diferenciar ou não caracteres acentuados (veremos adiante este analisador em uso). Temos assim uma visão em passos do processo de indexação:

1. Acessar os documentos originais e extrair o texto relevante para o usuário. 2. Processar o texto (análise). 3. Indexar.

Veja na Figura 2 uma visão esquemática desse processo e onde o Lucene se insere nele.

 

img

Figura 2. Visão esquemática de uma aplicação Java usando o Lucene.

 

Aplicação de exemplo: pesquisa textual no desktop

Vamos agora demonstrar na prática alguns dos conceitos apresentados, através de uma aplicação de exemplo que permite realizar a pesquisa em arquivos de forma interativa. A aplicação gráfica que criamos ilustra o uso básico do Lucene, sendo capaz de indexar arquivos nos formatos mais utilizados: MS Office (Word, Excel e PowerPoint), PDF, RTF, HTML e XML.

Sobre a extração

...

Quer ler esse conteúdo completo? Tenha acesso completo