Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá,
Gostaria de saber como fazer um sistema de busca no banco de acordo com várias palavras digitadas.
Estou usando o LIKE %PALAVRA%, mas obviamente ele encontra ocorrência onde existe esta palavra ou trecho dela. Assim se eu coloco mais de uma palavra ele não encontra nada.
Ex.:
Vamos imaginar que exista um título assim: Professor participa de mesa-redonda sobre Afro-Brasilidade
Se eu buscar por mesa obviamente ele vai encontrar.
Mas seu buscar mesa afro ele não encontra nada. E como se nota as duas palavras estão presentes no título.
Obs.: Não posso usar fulltext, pois a tabela é InnoDb.
Obrigado.
ok.. havia pensado no explode.. mas devo usar AND não OR, não acha?
>
ok.. havia pensado no explode.. mas devo usar AND não OR, não acha?
Isso quem vai ter que decidir é você. Lembrando que se usar AND só vai retornar uma linha se ela tiver todas as palavras buscadas, já OR não obriga que tenha todas as palavras.
Eu usaria OR.
Boa tarde,
Eu acho que é caso para se utilizar expressão regular.
Espero que ajude.
Concordo com o @Leozitho:
OR
Assim sua busca retornara resultado se qualquer uma das palavras for encontrada.
>
Eu acho que é caso para se utilizar expressão regular.
Permita-me discordar pois a consulta sera feita direto no db, via query. Assim, creio que o LIKE seja realmente a melhor opcao.
>
Concordo com o @Leozitho:
OR
Assim sua busca retornara resultado se qualquer uma das palavras for encontrada.
>
Eu acho que é caso para se utilizar expressão regular.
Permita-me discordar pois a consulta sera feita direto no db, via query. Assim, creio que o LIKE seja realmente a melhor opcao.
Discorda de expressão regular por ser a consulta direta no banco?
Eu tentaria algo assim, em (My)SQL:
-- contendo todas as palavras
WHERE coluna LIKE '%foo%bar%'
-- contendo pelo menos uma palavra
WHERE coluna REGEXP 'foo|bar'
Mas cada um é livre para escolher e conhecer outras alternativas e CRER em outras possibilidades.
Expressões regulares em consultas SQL só devem ser usadas quando são a única solução, já que pelo fato do interpretador de ER's não ser nativo do SGBD, é pior em desempenho do que se usado LIKE, por exemplo.
Para me certificar que estava correto, eu fiz um teste usando uma tabela minha que possui mais de 100 mil artistas cadastrados.
Teste usando LIKE:
>
SELECT *
FROM interpretes
WHERE nome LIKE '%Britney%'
OR nome LIKE '%Spears%'
LIMIT 0 , 30
Mostrando registros 0 - 3 (4 total, Consulta levou 0.1581 segundos)
Teste usando ER:
>
SELECT *
FROM interpretes
WHERE nome
REGEXP BINARY 'Britney|Spears'
LIMIT 0 , 30
Mostrando registros 0 - 3 (4 total, Consulta levou 0.8692 segundos)
Como fica comprovado neste simples teste, a consulta utilizando expressões regulares é bem mais lenta do que a usando LIKE, que é nativo do SGBD.
Essa consulta é super simples, logo, numa consulta mais complexa, a diferença de desempenho seria bem maior.
outra opção é uso de fulltext, mas só é util para o caso de busca para multiplas palavras, evitando ter que fazer vários OR.. OR... OR
um problema é que para poucas palavras o desempenho é relativamente lento.
não cheguei a fazer testes com o novo engine innodb do 5.5.8 >
Oi!
Quel tal:
$sql = 'select ... where campo LIKE %$palavra1% OR campo LIKE %$palavra2% ...';
Varios likes, de acrodo coma quantidade de palavras passadas ao parametro de busca, estas palavras podem ser separadas usando explode(' ', $busca) por exemplo.