Query de busca de palavra chave

Bem, antes de mais nada explico que não estou trabalhando com
nenhuma ferramenta de persitência de dados por um motivo simples,
porém que eu não posso contornar, MEU CHEFE NÃO QUER :lol: , mas voltando ao que interessa, bem tenho que fazer uma query de busca
palavras chaves em uma tabela, estou usando query`s sql,
buscando a palavra chave artigas, ficaria assim


SELECT * FROM WHERE CLASSIF LIKE '%artigas%' AND NUMTOMBO 
LIKE '%artigas%' AND AUTOR LIKE '%artigas%' AND TITULO LIKE '%
artigas%' AND LOCAL LIKE '%artigas%'
 AND DATA LIKE '%artigas%' AND NUMFLS LIKE '%artigas%' AND 
ESCALA LIKE '%artigas%' AND SUPORTE LIKE '%artigas%' AND 
DESCRICAO LIKE '%artigas%' AND ASSUNTO1 LIKE '%artigas%' AND OBS LIKE '%artigas%'  

isso só para uma palavra chave, imagine uma busca com um monte delas,
tem como simplificar isso? ou seja, uma query mais resumida, sem eu ter que colocar um monte de AND?

Cara na verdade esse select só vai retornar resultados que tiverem com todos os campos ‘like ‘%ARTIGAS%’’.

Relembrando tabela verdade do AND:
0 e 0 = 0
0 e 1 = 0
1 e 0 = 0
1 e 1 = 1

Resumindo, você deve utilizar OR :wink:

Agora indo ao que interessa, creio que não exista outro modo, mas você poderia limitar um pouco mais os campos deste select, por exemplo data nunca vai ter ARTIGAS, NUMFLS provavelmente não, tipo tenta criar uns modos pré definidos de pesquisa pq like é um comando muito pesado pro banco, ainda mais umas par deles, :mrgreen: :mrgreen: :mrgreen:

Abraço.

Essa query vai levar 10 anos para rodar em qq base de dados com uma quantidade razoavel de registros.

Rafael

putz, quanto ao operador boolean, é verdade, que vacilo :oops: Mas Rafael, o que vc usaria para melhorar a query, na verdade ela vai rodar um banco com uma única tabela de um 6500 registros…

Bom, faca o teste… mas LIKE nao eh performatico.

Rafael

Ainda mais um LIKE que começa com ‘%’. Os índices vão para a meretriz que deu a luz :expressionless:

Neste caso seria melhor criar uma tabela de dicionário e fazer um relacionamento entre o dicionario e as tabelas?

Senão me engano o JForum usa algo do tipo. Alguém tem uma referência boa para isso?

então executei a query MALUCA e fiz um teste assim

            System.out.println(System.currentTimeMillis());	
            ResultSet rs = stmt.executeQuery(query);          
            int i,cont;
            String s;
            String s1;
            String s2;
            cont = 0;
            while (rs.next()){
                i = rs.getInt(1);
                s = rs.getString(4);
                s1 = rs.getString(7);
                s2 = rs.getString(11);
                cont++;
            }
            System.out.println(System.currentTimeMillis());
            System.out.println(cont);

O resultado foi

1122659386906
1122659388390
577

O que deu mais ou menos 1500 milisegundos para 577 registros recuperados , num sei, acho que vou deixar assim, o que vcs acham? A idéia do Wanderley2k foi boa, mas o banco ó banco é de estimação do usuário, ele tem muito orgulho de monstra-lo para os seu clientes, seria complicado explicar que o banco dele tem defeitos conceituais, além de correr o risco de perder o cliente, mas mesmo assim vou tentar falar com ele.

Luiz-SP,

Na verdade não tem erro conceitual. O que pode existir é uma adequação do que existe para um modelo de busca mais sofisticado.

Vou colocar um trecho da materia da Revista Mundo Java, página 52:

Acho que seria interessante dar uma olhada no código do JForum para saber como ele faz isto e quão isto é esperto também.

Mas continuando pedindo para os SpamMan darem referencias legais sobre este assunto. :slight_smile: