Vous êtes sur la page 1sur 5

BUSCADOR

Crea un buscador de productos que permita buscar por:


Precio y marca de productos. Enva tu archivo a travs de
este medio.

JORGE
GODOY
CAMACHO

Buscador con PHP y 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 ttulo 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
darn 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 ms 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 bsqueda,
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 cmo
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>";;
}
?>

Vous aimerez peut-être aussi