Esse artigo faz parte da revista Java Magazine edição 49. Clique aqui para ler todos os artigos desta edição
Clique aqui para ler esse artigo em PDF.
Conhecendo o Apache Lucene
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.
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 "
[...] continue lendo...