Full Text Search com Sphinx

Sphinx

Quem administra sites com grande quantidade de informações sempre tem um campinho de busca em algum canto da tela. Hoje em dia a busca é essencial para segurar o visitante em qualquer site, pois se ele não encontra o que procura, acaba abandonando a página e não volta mais lá.

Muitas vezes essa busca é feita diretamente no banco de dados local, utilizando queries de SQL (já vi casos onde o desenvolvedor faz a busca utilizando LIKE em tabelas com uma quantidade muito grande de dados, matando a performance do servidor). Muita gente não sabe que o MySQL faz Full Text Search (FTS) nativo em suas bases MyISAM, aumentando muito a performance das buscas e possui todos os recursos de uma busca convencional (booleana, frases, relevância, etc).

Existe outra ferramenta chamada Sphinx que é excelente para FTS. Além de trabalhar nativamente com as bases MyISAM, o Sphinx oferece uma alternativa, que é o store engine próprio e específico para FTS chamado SphinxSE. Com ele é possível fazer buscas utilizando frases complexas, busca booleana (exemplo: ‘+albert -einstein’), boa relevância para busca utilizando proximidade de palavras, stopwords, e muito mais com um ganho enorme na performance.

A instalação do Sphinx sem o seu store engine é relativamente simples. Dessa forma é possível utilizar as ferramentas de indexação e busca tanto em linha de comando como implementar alguma rotina para integrar com as aplicações existentes de um site, por exemplo. A instalação do SphinxSE é um pouco chata, exige a aplicação de um patch nos fontes do MySQL e depois recompilar. Em minhas experiências, esse patch causou alguns problemas, pois a versão do MySQL que eu estou utilizando é mais recente do que a do patch e tive que fazer algumas correções na mão para funcionar. Parece que o desenvolvedor do Sphinx lançou uma versão mais nova a poucos dias, ainda não testei se o patch funciona de primeira, sem a necessidade de outras alterações no código.

Falando de buscas FTS, gosto muito do Xapian, mas o conceito é um pouco diferente. Esse assunto será discutido aqui em outra matéria.

Mais informações sobre o Sphinx podem ser obtidas nesse link.