Pesquisar várias tabelas

5

Desenvolvi uma aplicação web que é usada principalmente para arquivar todo tipo de material textual (documentos, referências a artigos, livros, revistas etc.). Pode haver qualquer número de tabelas de arquivamento no meu sistema, cada uma com seu próprio esquema. O esquema pode ser alterado por um moderador através do aplicativo (imagine algo semelhante a uma versão realmente simplificada do phpMyAdmin).

Os usuários podem pesquisar qualquer coisa de todas as tabelas. Usando índices FULLTEXT junto com a pesquisa por substring (campos que não suportam indexação FULLTEXT) o script insere os resultados de uma pesquisa em uma única tabela e ordenando esses resultados pela medida de similaridade eu posso facilmente retornar os resultados paginados.

No entanto, esta abordagem tem alguns problemas:

    A pesquisa de substrings
  • só pode contar resultados exatos
  • a regra de 50% se aplica a todas as tabelas separadamente e, portanto, , o mysql pode não retornar correspondências importantes ou ingenuamente descartar palavras comuns.
  • é bastante caro em termos de números de consulta e tempo de execução (não é um problema agora, pois ainda não há muitos dados nas tabelas).
  • os dados normalizados nem sequer são pesquisados (tenho tabelas diferentes para categorias, idiomas e anexos de arquivos).

Minha solução planejada Crie uma única tabela com colunas semelhantes a

id, table_id, row_id, data

Sempre que uma nova linha é criada / modificada / excluída em qualquer uma das tabelas de dados, essa tabela central também é atualizada com a coluna data contendo uma concatenação de todos os campos em uma linha. Eu poderia, então, criar um único índice para Sphinx e usá-lo para fazer pesquisas.

Existem soluções mais eficientes ou melhores práticas sobre como abordar isso? Obrigado.

    
por gilden 14.09.2011 / 22:30
fonte

1 resposta

2

Por que não deixar o mecanismo de pesquisa de texto como lucene ou sphinx faz todo o trabalho? Eu uso o Lucene e descobri que ele é muito bom em pesquisar várias tabelas e campos para o que você definiu como um destino.

Você não diz em qual parte do seu front-end da Web foi escrito, mas essas duas ferramentas podem ser usadas com a maioria dos idiomas.

Você adicionará muitos códigos para manter nos gatilhos que assistem a criação / modificação / exclusão em todas as tabelas. Não seria mais fácil adicionar a opção de administradores para marcar uma coluna como "a ser pesquisada". Em seguida, escreva o código para adicionar essa coluna aos campos indexados?

Vejo que o Sphinx tem "construção de índice off-line e atualizações incrementais de índice em tempo real", o que parece permitir que você adicione um campo, reconstrua o índice off-line e aumente o novo índice.

    
por 19.09.2011 / 04:34
fonte