Anda di halaman 1dari 3

Programar un buscador con PHP y MySQL

En este artculo voy a explicar como se puede hacer un buscador basado en


MySQL y PHP. Supongo al lector familiarizado con la programacin en PHP y la
administracin bsica de MySQL.
Como punto de partida, la informacin a buscar la tenemos que tener
almacenada en una tabla de nuestra base de datos. Pongamos como ejemplo
una tabla con artculos tcnicos que llamaremos ARTICULOS. Esta tabla
ARTICULOS tendr como mnimo dos campos llamados TITULO y
DESARROLLO, que almacenarn el ttulo del artculo y su contenido
respectivamente.

Los tipos de los campos a buscar debern ser CHAR, VARCHAR o TEXT con
sus variantes.
Ahora disearemos una pgina con un formulario y una caja de texto para
escribir la cadena de consulta busqueda y llamar al script de bsqueda
buscar.php. Ejemplo:
<FORM METHOD=POST ACTION="buscar.php">
Buscar: <INPUT TYPE="text" NAME="busqueda">
</FORM>
En el fichero buscar.php es donde est el click de la cuestin.
Hay que hacer la consulta que busque las palabras y devuelva como resultado
los registros coincidentes. Hasta aqu parece fcil y podramos resolverlo as:
SELECT * FROM ARTICULOS WHERE DESARROLLO LIKE '%$busqueda%'
OR TITULO LIKE '%$busqueda%'
Pues esta consulta nos mostrar todos los artculos que en su titulo o en su
contenido aparezca la frase de bsqueda tal y como nosotros la introducimos.
Esto es muy limitado ya que un cambio en el orden de las palabras o un
artculo de separacin dar al traste con nuestra bsqueda no mostrando los
resultados deseados.

Si bien podramos depurar y mejorar la sintaxis de nuestra bsqueda utilizando


el operador LIKE las bsquedas resultaran muy lentas y no tendran el
resultado esperado.
La solucin mas eficiente es utilizar los ndices FULLTEXT especficamente
indicados para estos menesteres. Pues bien esto implica ir a nuestra base de
datos, y crear un indice FULLTEXT con todos los campos que deseamos incluir
en nuestra busqueda, que en nuestro caso son TITULO y DESARROLLO. Para
ello basta con el phpmyadmin o bien escribir la instruccin directamente:
ALTER TABLE ARTICULOS ADD FULLTEXT(TITULO, DESARROLLO);

Una vez creado el ndice la instruccin SQL para buscar ser:


SELECT * FROM ARTICULOS WHERE MATCH(TITULO, DESARROLLO)
AGAINST ('$busqueda')
Esta lnea utiliza la funcin MATCH ... AGAINST ... que encuentra el texto
buscado, usando consultas en lenguaje natural parecido a como lo hacen los
motores de bsqueda. Adems, se calcula internamente una puntuacin en
funcin de como aparecen los trminos buscados dentro de nuestro artculo.
Perfeccionando la bsqueda:
SELECT * , MATCH (TITULO,DESARROLLO) AGAINST ('$busqueda') AS
puntuacion
FROM ARTICULOS WHERE MATCH (TITULO, DESARROLLO) AGAINST
('$busqueda')
ORDER BY puntuacion DESC LIMIT 50
Esta lnea devuelve los 50 primeros resultados encontrados ordenados de mas
a menos puntuacin. El valor de la puntuacion es un nmero decimal
comprendido entre 0 y 1 por cada ocurrencia del patrn de bsqueda, que se

ir sumando si ese patrn es encontrado en varias ocasiones. De cualquier


forma esta puntuacin es un algoritmo interno de la base de datos.
Algunos problemas. Las bsquedas realizadas con MATCH ...AGAINST en
ocasiones fallan cuando el trmino a buscar contiene una sola palabra. Por el
contrario son unas bsquedas rapidsimas que producen mejores resultados
que otros mtodos mas rudimentarios como el LIKE cuando se trata de varias
palabras o frases.
La solucin que le he dado a ese problema de las bsquedas con
MATCH...AGAINST has sido chequear el nmero de palabras a buscar,
utilizando una bsqueda simple con LIKE en el caso de una sola palabra, y el
mtodo MATCH...AGAINST en el caso de varias.
Ejemplo del fichero buscar.php
<?php
//cadena de conexion
mysql_connect("host","usuario","password");
// DEBO PREPARAR LOS TEXTOS QUE VOY A BUSCAR si la cadena existe
if ($busqueda<>''){
//CUENTA EL NUMERO DE PALABRAS
$trozos=explode(" ",$busqueda);
$numero=count($trozos);
if ($numero==1) {
//SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA
INSTRUCION CON LIKE
$cadbusca="SELECT REFERENCIA, TITULO FROM ARTICULOS WHERE
VISIBLE =1
AND DESARROLLO LIKE '%$busqueda%' OR TITULO LIKE '%
$busqueda%' LIMIT 50";
} elseif ($numero>1) {
//SI HAY UNA FRASE SE UTILIZA EL ALGORTIMO DE BUSQUEDA
AVANZADO DE MATCH AGAINST
//busqueda de frases con mas de una palabra y un algoritmo especializado
$cadbusca="SELECT
REFERENCIA, TITULO, MATCH ( TITULO,
DESARROLLO )
AGAINST ( '$busqueda' ) AS Score FROM ARTICULOS WHERE
MATCH ( TITULO, DESARROLLO ) AGAINST ( '$busqueda' ) ORDER BY
Score DESC LIMIT 50";
}
$result=mysql("teleformacion", $cadbusca);
While($row=mysql_fetch_object($result))
{
//Mostramos los titulos de los articulos o lo que deseemos...
$referencia=$row->REFERENCIA;
$titulo=$row->TITULO;
echo $referencia." - ".$titulo."<br>";
}
}
?>

Anda mungkin juga menyukai