Busca textual no Liferay Portal com Elasticsearch – Parte 1: História

Qual a aplicação indispensável de um portal web?

Liferay Portal é uma plataforma de portais web, referência de mercado, open source e em Java. Um portal web é um software que suporta várias aplicações, chamadas portlets; portlets podem inclusive estar na mesma página web. O Liferay Portal, por exemplo, inclui CMS, blog, wiki, fóruns, calendário, formulários, workflow, e-commerce e muito mais, por padrão. Ainda é possível criar suas próprias aplicações e acrescentá-las ao portal.

Por que é difícil fazer buscas em um portal

Uma aplicação obrigatória em todo portal é a pesquisa global. Usuários querem uma barra de busca simples, que procure por dados de todas as diferentes aplicações.

Isto é desafiador em um portal baseado em SQL como Liferay. Cada aplicação salva seus dados em tabelas próprias. SQL “tradicional” não é uma solução razoável para estes casos: as queries seriam imensas e difíceis de construir.

Além disso, faltam a SQL funcionalidades básicas de busca textual. Alguns dialetos de SQL possuem capacidades extras, mas Liferay Portal pode rodar em mais de quarenta SGBDs diferentes. Não poderíamos utilizar extensões de vendors.

Outra solução era necessária.

Bibliotecas como solução

Logotipo da Lucene, em que a palavra "lucene" aparece escrita em letras minúsculas cursivas, e o "l" do começo possui algumas "franjas" apontando para trás, dando a sensação de velocidade, movimento para frente.
Logotipo de Lucene

Essa outra solução era Apache Lucene, a biblioteca Java de indexação e busca. Lucene tornou-se praticamente a escolha natural quando se trabalha com pesquisa textual. Mesmo soluções mais robustas como Solr e Elasticsearch são construídos ao redor dele.

Como utilizávamos a biblioteca? Quando o Liferay salvava uma entidade buscável no banco SQL, passava seus campos para o Lucene. Lucene indexava o conteúdo (em um formato eficiente para busca) e o salvava no disco.

Havia porém um desafio. Em produção, portais Liferay sempre rodam em clusters. Como o Lucene salvava os dados no disco local, o conteúdo era indexado apenas no nó do cluster Liferay que recebeu a requisição. Para superar esta limitação, sincronizávamos os índices de Lucene com JGroups, uma biblioteca de mensageria que enviava mensagens entre os vários nós.

Utilizamos esta solução por vários anos… até adotarmos Elasticsearch.

O que é Elasticsearch?

Logotipo atual do Elasticsearch, em que três figuras geométricas formam um "E" meio arredondado.
Logotipo atual do Elasticsearch. (Confesso que achava o antigo mais fofinho.)

Resumidamente, Elasticsearch é banco de dados NoSQL criado com ênfase em para busca textual.

Baseado em Lucene, Elasticsearch é extremamente escalável, distribuído e simples. Hoje, além de ser quase um padrão de facto para busca textual, Elasticsearch é popular para análise de dados, monitoramento e segurança, especialmente em combinação com o resto da Elastic Stack. Atualmente utilizamos para muitas destas outras funções na Liferay, mas hoje focaremos aqui na busca textual.

As razões da migração

Por que abandonamos nossa solução e adotamos Elasticsearch? Por várias razões.

  1. Lucene é uma biblioteca de baixo nível, o que tornava a manutenção do código mais trabalhosa e cara. Elasticsearch é mais poderoso, simples e flexível.
  2. Elasticsearch roda e suas próprias VMs e cluster, enquanto Lucene rodava na JVM de Liferay. Mover a busca para fora das VMs do Liferay reduziu os recursos necessários nos servidores Liferay.
  3. As JVMs separadas do Elasticsearch também permite otimizá-las para busca sem conflitos com as configurações ideais para portal das VMs do Liferay.
  4. Clusterização e sincronização já eram partes de Elasticsearch. Pudemos deletar milhares de linhas de código!

Além de tudo, Elasticsearch se tornava padrão de mercado. Foi uma escolha natural.

Neste processo, aprendemos muito sobre Elasticsearch. Veremos um pouco do que descobrimos na próxima parte.

Post Revisions:

This post has not been revised since publication.

Post a Comment

Your email is never shared. Required fields are marked *

*
*