2012/9/5 Saulo Morais Lara <[email protected]>
> Tiago eu tbm fiz utilizando UNION e da maneira que mencionei no email
> anterior.
> Dei uma lida no FTS e acho que vai ficar inviável, pois terei que criar
> índices em todas as tabelas, e a busca será feita em vários campos.
> Então terei que criar índices compostos, etc.
> E este tipo de procura que pretendo fazer, vai ser pra qualquer tabela ou
> tela do meu sistema.
> Mas o lance é testar o melhor, ou seja, o mais rápido.
> Valeu por todas os opiniões.
>
>
humm... Cara já criei um modelo genérico num sistema (mais tem problemas,
discutirei mais abaixo). O modelo era o seguinte, eu recupero o texto
digitado pelo usuário e separo os espaços, em seguida eu vou concatenando a
query até formar o seguinte:
SELECT x, y, z FROM tabela -- parte fixa
WHERE x || y || z LIKE '%CENTRO%' AND x || y || z LIKE '%35%';
Podia ser OR ao invés de AND, no caso eu usava um modelo, se for espaço vai
ser AND se for ponto-e-vírgula (;) vai ser OR. Assim o usuário tem o poder
de criar uma "quase" expressão de busca.
O pseudo-código disso ficaria + ou - assim:
query = "SELECT x, y, z FROM tabela"
campo = "x || y || z"
filtro = input do usuário (com escape pra evitar sql injection, se não
usar prepared statements)
where = ""
for f1 in split(filtro, ";") do
sub_query = "1 = 1"
for f2 in split(f1, " ") do
sub_query = sub_query + " AND " + campo + " LIKE '%" + f2 + "%'"
end
if where is not empty then where = where + " OR "
where = where + "(" + sub_query + ")"
end
if where is not empty then where = " WHERE " + where
query = query + where
executa query
MAS...
Isso vai ser uma busca não indexada, logo, se você não adicionar um filtro
indexável no WHERE isso vai ser um seqscan, e, se a tabela for grande, vai
ser lento. No meu caso, a tabela não envolvia mais do que uns 5 mil
registros (tinha um filtro antes, isso já era dentro de um conjunto de
dados), logo a performance era aceitável. Se a tabela em questão tiver
muitos registros, com certeza a coisa vai ficar feia.
--
Matheus de Oliveira
Analista de Banco de Dados PostgreSQL
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral