Turbine suas buscas: O Hibernate Search é um framework cujo objetivo principal é habilitar o uso de buscas textuais em aplicações baseadas em JPA/Hibernate. As configurações de indexação são quase que totalmente baseadas em anotações, e a integração com o Lucene é executada de forma automática e transparente. Já o Apache Tika é uma biblioteca que provê uma API unificada para extração de conteúdo em diversos tipos de arquivos binários. É possível integrar ambos os frameworks através do mecanismo de bridges provido pelo Hibernate Search.

Este artigo apresenta os componentes necessários para construção de um mecanismo de busca, e discute brevemente o papel do Apache Lucene neste contexto. Em seguida, o Hibernate Search é apresentado, mostrando como integrar o Lucene com o popular framework de persistência Hibernate. Por fim, discute-se também o Apache Tika, e como é possível explorar suas funcionalidades de extração de conteúdo de arquivos binários em conjunto com o Hibernate Search e o Lucene.


Em que situação o tema é útil
: Este tema pode ser útil em diversas situações. Primeiro, toda aplicação baseada em JPA/Hibernate que possui requisitos de mecanismos de buscas textuais pode se beneficiar do uso do Hibernate Search, em detrimento do uso direto do Lucene. Em segundo lugar, aplicações que precisam extrair conteúdo de arquivos binários, tais como PDFs e DOCs, pode utilizar a API do Apache Tika para tal. Por fim, aplicações que possuem ambos os requisitos podem se beneficiar da integração dos dois frameworks, tal como apresentado neste artigo.

O grande volume de informações a que temos acesso gera uma crescente necessidade de mecanismos de buscas que sejam eficientes, precisos e confiáveis. Encontrar a informação desejada em um computador pessoal deixou de ser simplesmente uma questão de navegar para o diretório correto, e hoje envolve poderosos mecanismos de indexação e buscas, tais como o “Spotlight” da Apple e o finado Google Desktop. Esse problema é elevado a sua última potência quando o problema de encontrar o que se deseja é transportado para a Web e suas bilhões de páginas. Ainda que existam poderosos mecanismos de busca, tais como o Google e Bing, muitas vezes não conseguimos encontrar o que procuramos, ou perdemos páginas que gostaríamos de rever.

Nas últimas edições da revista esse assunto tem sido abordado extensivamente. Por exemplo, na edição 104, foi publicado um artigo de nossa autoria dissecando o Lucene, um poderoso framework que auxilia na construção de mecanismos de buscas em aplicações Java. Já as edições 106 e 107 tratam dos projetos Apache Nutch e Solr, voltados, respectivamente, para varreduras na Web e implementação de um servidor de buscas.

Esta edição retoma o assunto e apresenta dois outros projetos: o Hibernate Search e o Apache Tika. O primeiro é um projeto que tem como objetivo a integração do Hibernate com o Lucene, enquanto o segundo pode ser utilizado para a extração de conteúdo de uma infinidade de formatos de arquivos.

Iniciamos apresentando o Hibernate Search através da construção de uma aplicação de cadastro de currículos. Em seguida, falamos brevemente sobre o Tika, e, por fim, mostramos como ambos podem trabalhar em conjunto. Entretanto, antes de iniciar, vamos revisar rapidamente os passos necessários para implementar buscas em nossas aplicações.

Mecanismos de buscas e o Lucene

Normalmente, a implementação de mecanismos de buscas nas aplicações seguem uma mesma estrutura, cuja visão em alto nível pode ser observada na Figura 1. Em um extremo da figura temos o conteúdo propriamente dito, e em outro, os usuários que desejam realizar pesquisas sobre esse conteúdo. Para que a busca seja feita de forma eficiente, os mecanismos de busca baseiam-se nos chamados índices, que são estruturas de dados que permitem que os termos pesquisados sejam encontrados rapidamente, assim como a localização desses termos dentro do conteúdo.

É comum dividirmos as aplicações de busca em dois grandes grupos de funcionalidades: a construção do índice e as consultas que são realizadas com o seu auxílio.

Para a construção do índice, o primeiro passo consiste na etapa de aquisição do conteúdo. Por exemplo: o Google possui robôs, chamados de crawlers, que navegam pela Web a procura de novas páginas a serem indexadas. Uma vez obtido o conteúdo, eles são transformados nos chamados “documentos”, que nada mais são que representações canônicas, definidas pelo mecanismo de busca, e que representam o conteúdo obtido. Por exemplo: as buscas embutidas nos sistemas operacionais são capazes de encontrar palavras-chave em arquivos PDF, documentos Word ou até mesmo em mensagens armazenadas em clientes de e-mail. Portanto, nesta etapa do processo de indexação, todos esses diferentes tipos de documentos são convertidos para um formato comum, composto por um conjunto de campos padronizados, tais como autor, data de criação e o próprio conteúdo.

Em seguida, esses documentos são analisados a fim de tornar o índice mais efetivo. Alguns processamentos simples, tais como a conversão de maiúsculas para minúsculas, e a eliminação de conectivos, tais como “a”, “e” e “ou”, são comuns durante essa etapa. Todavia, procedimentos mais complexos também são utilizados. Por exemplo, é possível que as palavras sejam processadas a fim de reduzi-las à sua raiz morfológica. Assim, termos como “computação” e “computadores” são transformados em uma raiz comum, “computa”, permitindo que termos relacionados sejam encontrados. O resultado da análise é um conjunto de tokens, que são as “palavras” que efetivamente farão parte do índice. Esta etapa é uma das mais importantes do processo de indexação, podendo determinar o sucesso ou o fracasso da aplicação. Por fim, a última etapa do processo de indexação alimenta o índice com os tokens obtidos a partir do documento analisado.

Já no outro extremo da arquitetura temos os usuários, que interagem com a aplicação através de uma interface na qual ele entra com a busca desejada. Em seguida, há uma etapa em que a entrada do usuário é convertida para uma consulta em um formato definido pelo mecanismo de busca. Como uma analogia, pense na conversão de um filtro para uma consulta SQL a ser executada em um banco de dados.

A consulta é então executada utilizando como auxílio o índice construído anteriormente. É importante ressaltar novamente a importância do índice para uma execução eficiente da consulta. Sem ele, as buscas teriam que varrer todo o conteúdo em busca da informação requerida. Em um programa de e-mail ou em seu Desktop, o tempo necessário para essa varredura pode ser aceitável, mas para a Internet é inviável imaginarmos essa situação. Por fim, os resultados são finalmente apresentados para o usuário, geralmente ordenados por relevância ou outro critério que facilite localizar a informação desejada.

Componentes de uma aplicação de busca

Figura 1. Componentes de uma aplicação de busca (adaptado de [5]).

A Figura 1 mostra também as etapas deste processo que são o foco do Lucene. A próxima seção discute brevemente como utilizar o Lucene diretamente, mas o objetivo deste artigo é mostrar como o seu uso pode ser simplificado e flexibilizado através dos frameworks Hibernate Search e Apache Tika.

Hibernate Search

O uso de bancos de dados relacionais aliados a frameworks para seu gerenciamento, tais como o Hibernate, são praticamente onipresentes (ubíquos) em nosso dia-a-dia como desenvolvedor. Ao mesmo tempo, requisitos de execução de buscas textuais complexas em tabelas no banco de dados estão se tornando cada vez mais comuns. Este tipo de busca normalmente não pode ser expressa através de consultas SQL, ou, se expressas, são pesadas e ineficientes.

...
Quer ler esse conteúdo completo? Tenha acesso completo