[firebase-br] Full Text Search Engine

Fabio Nascimento fhpnascimento em gmail.com
Qua Set 21 12:21:41 -03 2016


Cézar eu desenvolvi um FTS aqui no firebird usando triggers.

Simplificando:

1) Eu tenho uma tabela TEXTOS com campos ID(integer) e TEXTO (blob
subtype1), nessa tabela obviamente são armazenados os textos para serem
lidos/pesquisados posteriormente;

2) Eu tenho uma tabela TEXTOS_INDICES com os campos ID(integer),
 ID_TEXTO(integer) uma FK pra tabela TEXTOS e um campo PALAVRA(varchar) que
são as palavras indexadas do referido texto;

3) Eu fiz um trigger no after insert/update da tabela TEXTOS, que pega o
campo TEXTO e quebra ele palavra por palavra através de um delimitador, no
caso espaço em branco, e vai inserindo na tabela TEXTOS_INDICE.. Na verdade
eu não indexo o texto inteiro por alguns motivos internos, mas a ideia é a
mesma, você pode indexar quantas palavras quiser;

4) Eu fiz uma stored procedure que faz a pesquisa em FTS, por exemplo, eu
pesquiso "VENDA E COMPRA E HIPOTECA" e o resultado traz todos os textos que
tenham essas 3 palavras, independente da onde elas aparecerem no texto, por
exemplo, se no texto tiver "COM A *VENDA* E DEPOIS A *COMPRA*, FOI POSSÍVEL
FAZER A *HIPOTECA*...", esse texto será encontrado.

Eu pesquisei bastante pra chegar nesse resultado, mas faz muito tempo,
então não lembro direito, mas eu acho que encontrei alguma coisa pra
postgreesql e alguns códigos em c++ e depois de estudá-los um pouco
consegui escrever tudo em PLSQL do firebird.

O resultado foi bem satisfatório, embora a tabela TEXTOS tenha pouco mais
de 4mil textos atualmente,  a busca demora 1 segundo..

Depois eu fiz uma outra versão onde as palavras são indexadas em uma tabela
de PALAVRAS, e criei uma tabela de PALAVRAS_IGNORADAS, para não indexar por
exemplo "de, da, e, a, etc..", tem bastante espaço pra melhorias sempre.

Eu usei esse recurso para fazer busca de nome de pessoas em outro caso e
também obtive um resultado satisfatório.

Se você não quiser/puder comprar algo pago, acho que pode ser um bom ponto
de partida para desenvolver sua própria solução..

Fábio Nascimento



Mais detalhes sobre a lista de discussão lista