Desde o surgimento de buscadores da internet, como o Yahoo e principalmente após o surgimento do Google, os usuários de sistemas corporativos cada vez mais sentiram a necessidade de obter informações de maneira rápida e eficiente. Usar mecanismos de indexação e full text search passa a ser necessário a partir deste momento, pois com um volume maior de informações geradas e armazenadas dentro das empresas, torna-se imprescindível a busca de informações de maneira rápida e eficiente.

Conhecer as principais tecnologias de indexação e de full text search disponíveis no mercado ajuda na tomada de decisão sobre qual tecnologia utilizar, de acordo com o contexto da corporação e com os requisitos funcionais e não funcionais. Este mecanismo só será relevante quando houver informações textuais de grande volume, como conteúdo de livros, documentos, emails enfim, tudo que possua texto e que o usuário deseje encontrar alguma informação contida neste texto.

Existem hoje no mercado inúmeras soluções, bibliotecas e componentes de full text search auxiliando na criação de projetos que contenham tais requisitos. Há soluções proprietárias, open sources e dos mais variados tipos, de maneira que cabe ao arquiteto do projeto escolher qual delas se encaixará melhor nos requisitos do sistema. A seguir, tem-se algumas das principais tecnologias de full text search existentes e utilizadas no mercado.

1 – Full Text no banco de dados

São soluções que são incluídas pelos fabricantes de banco de dados como Oracle, PostgreSQL, MySQL, entre outros. Possibilita a indexação dos dados armazenados no banco de dados, deixando o gerenciamento do índice (inserção, atualização e exclusão) a cargo do banco de dados.

Vantagens:

  1. Centralização do gerenciamento das informações, pois tanto os dados como o índice fica no banco de dados;
  2. Sincronização dos dados e dos índices. O banco controla cada registro quando é feito uma atualização (inserção, atualização e exclusão);
  3. Junção de SQL com queries de full text search. O SQL nos fornece uma grande flexibilidade de consulta, aliado à full text search, podendo ter consultas mais poderosas e eficientes;


Desvantagens:

  1. Escalabilidade: Em banco de dados o custo de se escalar é muito mais alto do que em uma aplicação Java EE. Alguns bancos chegam a não suportar ambientes clusterizados.
  2. Portabilidade: Como não há um padrão para as consultas em full text search (assim como há em SQL), cada banco provê uma maneira diferente de realizar esta consulta, com isto o sistema ficaria “preso” a um fornecedor de banco de dados ou com custo alto na mudança para outro fornecedor.
  3. Flexibilidade: Não são flexíveis ao ponto de fazer customizações no seu incide ou na maneira como são feitas as consultas.

São mais indicados:

  1. Quando não se tem autonomia na alteração no código do sistema (sistemas legados) e se deseja incluir full text search.
  2. Quando não se está disposto a investir tempo em desenvolvimento de uma solução mais aderente a regra de negócio
  3. Quando não há preocupação com a portabilidade dos dados nem com o pagamento de licenças.

2 – Appliance Solutions

São soluções dedicadas de full text search, usado, por exemplo, para indexar conteúdo de sites, intranet entre outros. Graças a seu foco, possui uma grande performance tanto para indexação quanto para processar consultas.

Exemplos: Google Search Appliance
Funcionalidades que geralmente possuem:

  • Crawling de websites, CMS, wikis e databases
  • Indexa um conjunto variado de documentos
  • Possui autenticação com LDAP, Windows entre outros.


Vantagens:

  1. Por ser um produto dedicado, possui uma performance excelente.
  2. Já possui de maneira integrada a indexação e a consulta.


Desvantagens:

  1. Flexibilidade: Apesar de prover uma API para se conectar ao componente, não possui uma flexibilização na forma como é feita a indexação ou a consulta.
  2. Escalabilidade: Criar uma solução clusterizada com esta solução, vai depender muito de cada fornecedor.


Observações: O Preço pode variar de acordo com o tamanho do índice ou pelo número de documentos indexados.


São mais indicados: Quando se deseja indexar todos os documentos já produzidos pela organização e que estejam em uma intranet, páginas, banco de dados, entre outros e que não se tenha a necessidade de alterar a maneira como está sendo feita a indexação.

3 – Bibliotecas

São full text engines que você pode adicionar e usar na sua aplicação. Comparada com as outras soluções, é a mais flexível das apresentadas. O desenvolvedor pode escolher quais dados serão indexados, quais serão pesquisados por full text search e quais serão pesquisados normalmente, ou seja, quais informações estarão no índice e quais estarão no banco de dados.

O desenvolvedor é livre para manipular os dados antes da indexação e é livre para decidir como o usuário irá expressar a sua consulta. O Desenvolvedor só precisa ter autonomia para tomar esta decisão no projeto. (Se for um projeto onde ele não pode alterar o fonte, esta solução não é indicada)

Entre as bibliotecas disponíveis há o Apache Lucene e o Hibernate Search .O Lucene é o core do Hibernate Search e é usado por vários servidores de busca.

O Hibernate Search veio para unir o potencial do Lucene com o potencial do Hibernate Core, resolvendo assim a defasagem que há entre o mundo dos flat text e dos objetos (mundo OO). Com ele é possível mapear os objetos usando as anotações do JPA ou do próprio Hibernate e acrescentar as anotações do Hibernate Search que informará que o objeto terá campos indexados. Segue abaixo um exemplo:

@Entity 
@Indexed 
public class Item { 
@Id @GeneratedValue 
@DocumentId 
private Integer id; 
@Field 
private String title; 
}

Como visto no exemplo, basta anotar a entidade com a annotation @Indexed, descrever qual será o identificador único deste documento quando o Hibernate Search for indexar usando a annotation @DocumentId e depois descrever quais são os campos indexáveis desta classe usando o @Field.

Para pesquisar os objetos indexados usando full text search, usa-se a sintaxe do Lucene para realizar a consulta, como segue:

luceneQuery=”title:casmurro”
FullTextSession ftSession = Search.getFullTextSession(session); 
org.hibernate.Query query = ftSession.createFullTextQuery( 
luceneQuery, 
Item.class); 
List results = query.getResultList();

Como observado, é uma consulta similar as consultas feitas usando JPA(JPQL), com a vantagem de se usar um recurso mais eficiente de busca.

Vantagens:

  1. Flexibilidade: Facilita as customizações para ficarem mais aderentes as necessidades de negócio.
  2. Escalabilidade: A grande maioria das bibliotecas, provê formas de ser escalável. (ambientes clusterizados, por exemplo). Pelo fato de serem flexíveis, pode ser montada uma arquitetura com boa escalabilidade.
  3. Portabilidade: Facilita a migração do sistema para outras plataformas.


Desvantagens:

  1. Necessita de tempo de desenvolvimento para utilizar dentro da aplicação.

São mais indicados: Quando se deseja customizar a indexação ou a full text search para atender a requisitos específicos de negócio da corporação.

4 – Servidores de busca

São servidores dedicados para operações de indexação e de consulta usando full text. São, em sua maioria, soluções híbridas entre apliance solutions e bibliotecas pois além de serem servidores dedicados, permitem a alteração do mecanismo de busca ou de indexação.

São exemplos destes servidores o Microsoft Search Server e o SOLR. O SOLR é um servidor de busca dedicado feito em java que usa por baixo o Apache Lucene. É open source e permite que seja alterada a maneira de como as informações serão indexadas, fornece uma API de suporte (a SolrJ) aos desenvolvedores para utilizarem em seus projetos.

O SOLR possui mecanismo de clusterização, replicação e é extremamente eficiente sendo usado hoje por inúmeras empresas como AOL, NASA, CISCO entre outras.


Vantagens:

  1. Flexibilidade: Facilita as customizações para ficarem mais aderentes as necessidades de negócio
  2. Escalabilidade: Em geral, possui mecanismo que permite escalar o servidor de buscar em várias nós.
  3. Baixo Acoplamento: Como fica externo à aplicação, minimiza o acoplamento no uso da solução.


Desvantagens:

  1. Dificuldade na migração: Dependendo do servidor, não será possível migrar o índice para outra solução ou outro servidor de indexação.

Conclui-se que dependendo da situação de cada organização, cada solução de full text search deve ser avaliada, pois cada organização possui seus requisitos próprios. Hoje há diversas soluções open-source que atendem perfeitamente a maioria dos requisitos funcionais e não funcionais. Cabe ao arquiteto do projeto de software, escolher a melhor solução para o seu cenário considerando sempre as vantagens e a desvantagens de cada solução.

Anderson Vasconcelos – Dextra Sistema