Sistema de busca por palavra chave em um banco de dados

Não sei se aqui é o local certo para está pergunta.

Eu tenho um modelo de dados normal como outro qualquer e preciso realizar a busca por palavra chave, no estilo google. Porem essa busca tem que ser realizada em divesas tabelas e colunas do modelo. Minha dúvida é como estrutura essa base. Eu não sei se cabe aqui um modelo de datawarehouse ou simplesmente criar uma tabela e armazenar nela o conteudo de todas as colunas que preciso pesquisar pela palavra.

Dá uma pesquisada no Apache Solr… pode ser que te sirva…

Então marciorodr0, para esse caso existe o hibernate search. Minha dúvida não está relacionado ao framework e sim ao modelo estrutural das tabelas.

Indexar a coluna no banco mesmo já não está bom?

[]'s

Você pode adicionar uma nova coluna por tabela, com o “soundex” ou a “fonologia” da palavra, e buscar por lá. Isto se a sua busca é feita em colunas com somente uma palavra, para textos não ficaria legal.

Outra opção seria uma nova tabela com a palavra e uma referência para linha de outra tabela (ficaria mais trabalhoso).

[quote=Giulliano]Você pode adicionar uma nova coluna por tabela, com o “soundex” ou a “fonologia” da palavra, e buscar por lá. Isto se a sua busca é feita em colunas com somente uma palavra, para textos não ficaria legal.

Outra opção seria uma nova tabela com a palavra e uma referência para linha de outra tabela (ficaria mais trabalhoso).

https://github.com/giullianomorroni/API/blob/master/GeradorFonetica.java[/quote]

Giulliano,

Tenho quase certeza de que geração fonética não é tão simples assim. Isso porque tem alguns fonemas que dependem de contexto, por exemplo:

Raphael - Rafael (precisa ser substituído)
PH (acidez) - não precisa ser substituído

Uma vez eu ví um artigo da SQL Magazine que tinha uma implementação, e era estupidamente mais complexo do que find/replace.

EDIT: Como dito num tópico do StackOverflow, o algoritmo de distância de Levenshtein talvez produza resultados melhores do que soundex. http://en.wikipedia.org/wiki/Levenshtein_distance

[]'s

Para mim a melhor solução para isso é a solução do marciorodr0 mesmo. Usar Apache Solr ou Elastic Seach.

Não sei como funciona o Hibernate Search, mas se usar esses dois não precisará alterar seu modelo de dados em nada. Eles rodam num serviço a parte.

Edit:

Uma observação sobre essas funções soundex nativas dos bancos: geralmente são em inglês e não dão bons resultados em português.

E acho que esse tipo de pesquisa pede um mecanismo bem mais flexível.

[quote=Alexandre Saudate]
Giulliano,

Tenho quase certeza de que geração fonética não é tão simples assim. Isso porque tem alguns fonemas que dependem de contexto, por exemplo:

Raphael - Rafael (precisa ser substituído)
PH (acidez) - não precisa ser substituído

Uma vez eu ví um artigo da SQL Magazine que tinha uma implementação, e era estupidamente mais complexo do que find/replace.

EDIT: Como dito num tópico do StackOverflow, o algoritmo de distância de Levenshtein talvez produza resultados melhores do que soundex. http://en.wikipedia.org/wiki/Levenshtein_distance
[]'s[/quote]

É verdade…esse trecho de código está muito simples para cobrir todas as possíveis varíaveis. Usar a distância de Levenshtein tb tem seus problemas, pq ele não considera a posição dos caracteres apenas a quantidade de substituições. O que poderia trazer resultados fora do contexto. Num futuro distante espero aperfeiçoar esta classes para gerar ao menos um fonema melhor.