Lucene, Solr, Mysql e outras bruxarias

___






Recentemente precisei aprender como funciona um sistema de busca de informação para uma pesquisa. Tentei implementar uns mas sempre esbarrei no problema de como manter em memória e diminuir o IO em disco. Não é simples quando se quer trabalhar com milhões de textos com varios Gb de tamanho que não cabem na memória. Por isso larguei mão de tentar desenvolver um do zero, e fazer o projeto sair do papel, ja que a busca de informação é apenas 5% do projeto todo. Não temos tempo a perder! :-P


Não explicarei aqui configuração das Engines de busca, mas sim apenas uma visão geral da diferença entre elas.

Mas afinal, o que é Full-text Search?

Fulltext search ou recuperação de documentos é uma necessidade crescente. Com o volume de dados crescendo a cada dia, principalmente por conta da internet, a necessidade de conseguirmos resgatar a informação desejada, e principalmente, relevante à nossa busca,  é um desafio e ainda motivo de muita pesquisa. O modo de funcionamento de um sistema de busca esta alem do escopo deste texto, mas se você chegou até este post, basta saber que full-text search é uma area de estudo dentro da area de Recuperação de Informação.

MySQL

Como usuário do MySQL de diversos anos, foi natural minha primeira alternativa ver como o MySQL se comportava para este tipo de busca. Ao contrario do que muitos poderiam pensar, não é usando LIKE %% que se faz uma busca textual noMySQL . Embora por muito tempo achei que isso fosse bom, a busca usando like não é performático e muito menos relevante. Sendo assim, o melhor caminho é o uso de index do tipo  FULLTEXT para as colunas desejadas.

O tempo de retorno do MySQL para 1.500.000 de registros nem sempre é o melhor até ser cacheado. Mas o principal fator de eu ter descartado o MySQL é por sua falta de recursos para customização de relevancia, onde este utiliza um algoritmo hardcoded muito basico (e comum), chamado TFIDF. Que basicamente pondera por relevancia, a quantidade global da frequencia de uma determinada palavra, e da frequencia em determinado documento. [Veja aqui mais detalhes sobre isso] 

Embora existam (limitadas) alternativas para rankear os resultados, a performance cai drasticamente ao não usar o modo "normal" do MySQL

Lucene, Solr, ElasticSearch

Na literatura, estas são as 3 principais referencias em Engine de Fulltext. Lucene, Solr e Elasticsearch são amplamente utilizados no mundo afora. 

Lucene foi desenvolvido em Java e é encubado pela Apache Software Foundation e, obviamente, sob a licença de uso da Apache tambem. 

Lucene é a base, o motor, para o Solr e o ElasticSearch. Podemos entender a diferença entre eles como um Carro e um Motor. Você não pode dirigir um motor, mas pode dirigir um carro. Então podemos entender que o Solr e o Elasticsearch tem o Lucene dentro deles, porem, o Solr e Elasticsearch nos disponibilizam uma série de recursos extras (um volante, ar condicionado, banco em couro...).

O Lucene é uma biblioteca especializada em indexar e buscar textos.

O Solr veio da necessidade de facilitar o modo como as coisas são indexadas, por isso ele possui o Lucene e uma casca com diversos recursos, como criação de highlighting, faceleted search, integração com banco de dados e wrappers para indexar HTML, PDF, DOC, interface de administração HTML. Alem de implementar uma camada que faz replicação da indexação. Outro detalhe interessante é que, diferente do Lucene, o Solr é uma aplicação web (.war) que roda sobre algum servlet container, como o Jetty ou Tomcat. Para entender mais sobre as caracteristicas do Solr, entre aqui.

O Elasticsearch, semelhante ao Solr, provem de uma série de recursos que extendem o Lucene, entretanto, dotado de recursos para que seja facilmente distribuível, o que permite escalar o negócio com mais facilidade.

Conclusão

Como tudo na vida, você deve fazer escolhas de acordo com sua necessidade. Mas aqui vão algumas dicas:

  • Se sua aplicação é do tipo Desktop e sua base atual já é MySQL e seu usuário pode perder algum tempo procurando o resultado mais relevante, o MySQL pode lhe atender.
  • Se sua aplicação é Desktop e você quer indexar apenas textos brutos (entenda como "strings"), mas precisa de flexibilidade em customizar seu rank de resultados, o Lucene pode ser uma boa alternativa. Porem, tenha em mente que muita coisa precisará ser feita por você, por exemplo, para indexar o conteudo de um banco de dados, será necessário fazer um looping em toda a tabela de seu banco de dados, e criar e indexar um campo no Lucene. Alem de ter que ter o controle das atualizações para saber o que precisa ser indexado novamente no Lucene. Outro ponto importante é se seu projeto é em outra linguagem que não o Java. O Lucene é uma biblioteca em Java, então ela funciona bem em projetos java. Embora seja possível usar wrappers para Python e C, utilizando o JCC (Java Call Control), a integração é um pouco chata, e o melhor caminho pode ser usar o Solr que possui uma interface REST.
  • Se você pretende indexar pdf, docs, html, e tem necessidade de uma interface por exemplo REST com outros sistemas, ou integração já com banco de dados,  o Solr é uma boa opção. Chuto que o Solr deve atender 90% dos projetos.
  • Se você tem um sistema que provavelmente vai crescer em acesso e volume de informação, e provavelmente tenha a necessidade de escalar, o Elasticsearch parece ser a melhor opção.

Talvez sua principal duvida agora seja  escolher entre Solr e o Elasticsearch. Para tentar tirar essa duvida, esta tabela comparativa pode te ajudar - Apache Solr vs ElasticSearch






Veja tambem:

___

Wordpress REST API - Permitindo Visualização de Post Privados para Usuários do tipo Assinantes

A API REST do Wordpress trouxe novas possibilidades. No entanto, deparei com um problema para listar os Posts cadastrados como Privados para Usuários do tipo "Assinante".

Como deixar imagem redonda de um CANVAS com HTML 5

Como deixar imagem redonda de um CANVAS com HTML 5

Neste post mostro como deixar uma imagem dentro de um círculo com sombra usando canvas do HTML5 !

Como deixar uma imagem redonda e com sombra em CSS

Como deixar uma imagem redonda e com sombra em CSS

Fazendo uma imagem ficar dentro de um círculo em CSS

Resolvendo o problema No 'Access-Control-Allow-Origin' header is present on the requested resource.

Como permitir acesso a outra url - Cross Origin Resource Sharing (CORS)

Como instalar o Windows 10 IoT no Raspberry usando o Windows 7

Como instalar Windows 10 no Raspberry Pi 2

Lucene, Solr, Mysql e outras bruxarias

Uma breve explicação sobre fulltext search e onde usar.

Programando Python usando Eclipse com PyDev

Programando Python usando Eclipse com PyDev

Eclipse como EDE para programar em Python !

Como desenvolver em Python usando o Netbeans 7.4

Como desenvolver em Python usando o Netbeans 7.4

Programando em python usando o netbeans como IDE

Criatividade é saber esconder suas fontes

Criatividade, nada mais do que do que pegar idéias existentes, junta-las, e modifica-las.

Tudo é um Remix (Legendado)

Tudo é um Remix (Legendado)

O que é criatividade? Copiar, transformar e combinar.

Configurando um Servidor com Nginx e Django - Juntando Tudo - Parte Final

Integrar nginx e django. Ultima parte.

Veiculo Guiado a Laser - LGV (Laser Guided Vehicle)

Veiculo Guiado a Laser - LGV (Laser Guided Vehicle)

Desenvolvimento do algoritmo de controle de direção de LGV (um AGV guiado a laser)

Configurando um Servidor com Nginx e Django - Parte 2

Configurando um Servidor com Nginx e Django - Parte 2

Instalando o Django

Como User Experience pode melhorar seu produto?

Como User Experience pode melhorar seu produto?

User Experience (Design Centrado no Usuário, ou Experiência do Usuário) é um termo usado quando se desenvolve produtos, sistemas ou serviços focado em pessoas, envolvendo fatores humanos no projeto.

Configurando um Servidor com Nginx e Django

Configurando um Servidor com Nginx e Django

Este post é o inicio de uma série de como configurar um servidor usando o nginx como proxy reverso e o django como servidor de aplicação.

SISTEMA DE NAVEGAÇÃO CIRÚRGICA

SISTEMA DE NAVEGAÇÃO CIRÚRGICA

Também chamada de “Cirurgia Guiada por Computador”, a navegação cirúrgica consiste em um sistema que gera um modelo virtual 3D do paciente para guiamento de instrumentos cirúrgicos de maneira precisa e em tempo real, orientando o médico no momento da cirurgia.

O FACEBOOK VAI ACABAR… E VOCÊ?

O FACEBOOK VAI ACABAR… E VOCÊ?

Recentemente, uma onda de notícias surgiu na internet: O fim do Facebook até 2020.

E QUANDO DOIS CHATBOTS SÃO COLOCADOS PARA CONVERSAR?

Chatbot são programas de computadores que tentam manter o dialogo com pessoas reais utilizando linguagem natural. É um dos desafios da Inteligencia Artificial.

TRACKING POR COR COM WEBCAM

Utiliza segmentação de imagem para extrair da imagem o ponto de interesse, no caso o ponto vermelho do laser. Envia controle via porta paralela para os servos que controlam a posição webcam. Usa Video4Linux e foi desenvolvido em C na plataforma Linux.

RASTREIO DE MOVIMENTO DE PESSOAS EM TEMPO REAL

Protótipo criado para testar a viabilidade de implementação de rastreio de comportamento de consumidores em lojas de departamentos. Utiliza múltiplas câmeras posicionadas em pontos diferentes do espaço. Plataforma Linux, desenvolvido em C usando v4l2 e placa de captura de video geovision gv800.

PENDRIVE WIRELESS BLUETOOTH

Protótipo com memória SD que poderia ser conectada via USB (como um pendrive comum) ou via Bluetooth

GERENCIADOR DE TRÁFEGO DE AGV'S (AUTOMATED GUIDED VEHICLE)

GERENCIADOR DE TRÁFEGO DE AGV'S (AUTOMATED GUIDED VEHICLE)

O gerenciador consiste em um software responsável pela navegação de AGVs (Veiculos da foto ao lado)

MEDIDOR DE CONSUMO ELÉTRICO VIA BLUETOOTH

MEDIDOR DE CONSUMO ELÉTRICO VIA BLUETOOTH

Protótipo consiste em um verificador de consumo de energia elétrica de algum equipamento. A leitura da potencia consumida é feita utilizando a placa MCP3905A Energy Board Meter, da Microchip.

SISTEMA DE AUXILIO AO DEFICIENTE VISUAL NO TRANSPORTE PÚBLICO

SISTEMA DE AUXILIO AO DEFICIENTE VISUAL NO TRANSPORTE PÚBLICO

uma aplicação para um celular touch screen, o deficiente visual, ao passar por um ponto de ônibus, escuta um alerta sonoro de que se encontra no ponto de ônibus X

EXPANSÃO VISUAL DE PROJEÇÕES EM TELAS PLANAS

Projeto de TCC da FEI. Vencedor de 2 prêmios: “Melhor Trabalho Geral” e “Criatividade e Inovação”

REDIS – UM BANCO DE DADOS NÃO RELACIONAL.

REDIS – UM BANCO DE DADOS NÃO RELACIONAL.

NoSQL significa ”Not only SQL” (Não somente SQL), e é uma alternativa aos tradicionais bancos de dados relacionais, mas que não oferecem as caracterizadas ACID (Atomicidade, Consistência, Isolamento e Durabilidade).

Leitor de RSS

Leitor de RSS

Leitor Online de Noticias que desenvolvi em 2010.

CONTROLE SEM FIO COM FEEDBACK DE COMANDO

CONTROLE SEM FIO COM FEEDBACK DE COMANDO

Circuito eletrônico para controle de automação, com feedback de se o comando foi executado no circuito remoto.

Fábio Martins

Olá, eu sou o fábio. Clique em Continuar Lendo para saber mais.

Leitura Automática de Tacógrafo Analógico

Leitura Automática de Tacógrafo Analógico

Programa desenvolvido para analise automática de disco de tacógrafo analógico.