Programar um buscador com PHP e MySQL
Passos a seguir para a criação de um buscador com PHP e MySQL.Por Alfredo Anaya
Publicado em: 29/4/08
Suponho que o leitor esteja familiarizado com a programação em PHP e com a administração básica de Mysql.
Como ponto de partida, temos que ter a informação a buscar armazenada e, uma tabela de nosso banco de dados. Colocamos como exemplo uma tabela com artigos técnicos que chamaremos ARTIGOS. Esta tabela ARTIGOS terá como mínimo dois campos chamados TITULO e DESENVOLVIMENTO, que armazenarão o título do artigo e seu conteúdo respectivamente.
Os tipos dos campos a buscar deverão ser CHAR, VARCHAR ou TEXT com suas variantes.
Agora desenharemos uma página com um formulário e uma caixa de texto para escrever a cadeia de consulta "busca" e chamar ao script de busca "buscar.php". Exemplo:
<FORM METHOD=POST ACTION="buscar.php">
Buscar: <INPUT TYPE="text" NAME="busca">
</FORM>
No arquivo buscar.php é onde está o clique da questão.
Há que fazer a consulta que busque as palavras e devolva como resultado os registros coincidentes. Ate aqui parece fácil e poderíamos resolvê-lo assim:
SELECT * FROM ARTIGOS WHERE DESENVOLVIMENTO LIKE '%$busca%' OR TITULO LIKE '%$busca%'
Pois esta consulta nos mostrará todos os artigos em seu título ou que em seu conteúdo apareça a frase de busca tal e como nós a introduzimos. Isto é muito limitado já que uma mudança na ordem das palavras ou um artigo de separação terminará com nossa busca não mostrando os resultados desejados.
Também poderíamos depurar e melhorar a sintaxe de nossa busca utilizando o operador LIKE, porém as buscas resultariam muito lentas e não teriam o resultado esperado.
A solução mais eficiente é utilizar os índices FULLTEXT especificamente indicados para estas funções. Sendo assim, isto implica ir ao nosso banco de dados e criar um índice FULLTEXT com todos os campos que desejamos incluir em nossa busca, que em nosso caso são TITULO e DESENVOLVIMENTO. Para isso, basta com o phpmyadmin ou então escrever a instrução diretamente:
ALTER TABLE ARTIGOS ADD FULLTEXT(TITULO, DESENVOLVIMENTO);
Uma vez criado o índice a instrução SQL para buscar será:
SELECT * FROM ARTIGOS WHERE MATCH(TITULO, DESENVOLVIMENTO) AGAINST ('$busca')
Esta linha utiliza a função MATCH ... AGAINST ... que encontra o texto buscado, usando consultas em linguagem natural parecida a como o fazem os motores de busca. Ademais, se calcula internamente uma pontuação em função de como aparecem os termos buscados dentro de nosso artigo.
Aperfeiçoando a busca:
SELECT * , MATCH (TITULO,DESENVOLVIMENTO) AGAINST ('$busca') AS pontuacao FROM ARTIGOS WHERE MATCH (TITULO, DESENVOLVIMENTO) AGAINST ('$busca') ORDER BY pontuacao DESC LIMIT 50
Esta linha devolve os 50 primeiros resultados encontrados ordenados de mais a menos pontuação. O valor da pontuação é um número decimal compreendido entre 0 e 1 por cada ocorrência do padrão da busca, que se irá somando se esse padrão for encontrado em várias ocasiões. De qualquer forma esta pontuação é um algoritmo interno do banco de dados.
Alguns problemas: As buscas realizadas com MATCH ...AGAINST em ocasiões falham quando o termo a buscar contém uma só palavra. Do contrário são umas buscas rapidíssimas que produzem melhores resultados que outros métodos mais rudimentares como o LIKE quando se trata de várias palavras ou frases.
A solução que dei a esse problema das buscas com MATCH...AGAINST foi checar o número de palavras a buscar, utilizando uma busca simples com LIKE no caso de uma só palavra, e o método MATCH...AGAINST no caso de várias. Exemplo do arquivo buscar.php
<?php
//cadeia de conexao
mysql_connect("host","usuario","password");
//DEVO PREPARAR OS TEXTOS QUE VOU BUSCAR se a cadeia existe
if ($busca<>''){
//CONTA O NUMERO DE PALAVRAS
$pedacos=explode(" ",$busca);
$numero=count($pedacos);
if ($numero==1) {
//SE SO HA UMA PALAVRA DE BUSCA SE ESTABELECE UMA INSTRUCAO COM LIKE
$cadbusca="SELECT REFERENCIA, TITULO FROM ARTIGOS WHERE VISIBLE =1 AND DESARROLLO LIKE '%$busca%' OR TITULO LIKE '%$busca%' LIMIT 50";
} elseif ($numero>1) {
//SE HA UMA FRASE SE UTILIZA O ALGORTIMO DE BUSCA AVANCADO DE MATCH AGAINST
//busca de frases com mais de uma palavra e um algoritmo especializado
$cadbusca="SELECT REFERENCIA, TITULO , MATCH ( TITULO, DESENVOLVIMENTO ) AGAINST ( '$busca' ) AS Score FROM ARTIGOS WHERE MATCH ( TITULO, DESENVOLVIMENTO ) AGAINST ( '$busca' ) ORDER BY Score DESC LIMIT 50";
}
$result=mysql("teleformacao", $cadbusca);
While($row=mysql_fetch_object($result))
{
//Mostramos os titulos dos artigos ou o que desejemos...
$referencia=$row->REFERENCIA;
$titulo=$row->TITULO;
echo $referencia." - ".$titulo."<br>";;
}
?>
Links para completar esta informação:
http://www.fabio.com.ar/verpost.php?id_noticia=959
http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html
Comentários do artigo