Inicio » Artículos » Programación » PHP » Programar un buscador con php y mysql

Suscríbete al boletín

Recibirás información detallada de nuestras ofertas, noticias, etc.

Suscríbete al boletín

Enviar a un amigo

Si crees que este Artículo le puede interesar a un amigo puedes enviarselo desde aquí.

Enviar a un amigo

Programar un buscador con php y mysql

Alfredo Anaya 01-09-2004

En este artículo voy a explicar como se puede hacer un buscador basado en MySQL y php.

Supongo al lector familiarizado con la programación en php y la administración básica de Mysql.

  1. Como punto de partida, la información a buscar la tenemos que tener almacenada en una tabla de nuestra base de datos. Pongamos como ejemplo una tabla con artículos técnicos que llamaremos ARTICULOS. Esta tabla ARTICULOS tendrá como mínimo dos campos llamados TITULO y DESARROLLO, que almacenarán el título del artículo y su contenido respectivamente.

    Los tipos de los campos a buscar deberán ser CHAR, VARCHAR o TEXT con sus variantes.

  2. Ahora diseñaremos una página con un formulario y una caja de texto para escribir la cadena de consulta "busqueda" y llamar al script de búsqueda "buscar.php". Ejemplo:

    <FORM METHOD=POST ACTION="buscar.php">
    Buscar: <INPUT TYPE="text" NAME="busqueda">
    </FORM>

  3. En el fichero buscar.php es donde está el click de la cuestión.
    Hay que hacer la consulta que busque las palabras y devuelva como resultado los registros coincidentes. Hasta aquí parece fácil y podríamos resolverlo así:

    SELECT * FROM ARTICULOS WHERE DESARROLLO LIKE  '%$busqueda%' OR TITULO LIKE  '%$busqueda%'

    Pues esta consulta nos mostrará todos los artículos que en su titulo o en su contenido aparezca la frase de búsqueda tal y como nosotros la introducimos. Esto es muy limitado ya que un cambio en el orden de las palabras o un artículo de separación dará al traste con nuestra búsqueda no mostrando los resultados deseados.
    Si bien podríamos depurar y mejorar la sintaxis de nuestra búsqueda utilizando el operador LIKE las búsquedas resultarían muy lentas y no tendrían el resultado esperado.

  4. La solución mas eficiente es utilizar los índices FULLTEXT específicamente 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 instrucción directamente:

    ALTER TABLE ARTICULOS ADD FULLTEXT(TITULO, DESARROLLO);



  5. Una vez creado el índice la instrucción SQL para buscar será:

    SELECT * FROM ARTICULOS WHERE MATCH(TITULO, DESARROLLO) AGAINST ('$busqueda')

    Esta línea utiliza la función MATCH  ...  AGAINST ... que encuentra el texto buscado, usando consultas en lenguaje natural parecido a como lo hacen los motores de búsqueda. Además, se calcula internamente una puntuación en función de como aparecen los términos buscados dentro de nuestro artículo.

  6. Perfeccionando la búsqueda:

    SELECT  * , MATCH (TITULO,DESARROLLO) AGAINST ('$busqueda') AS puntuacion FROM ARTICULOS WHERE  MATCH (TITULO, DESARROLLO) AGAINST ('$busqueda') ORDER  BY puntuacion DESC LIMIT 50

    Esta línea devuelve los 50 primeros resultados encontrados ordenados de mas a menos puntuación. El valor de la puntuacion es un número decimal comprendido entre 0 y 1 por cada ocurrencia del patrón de búsqueda, que se irá sumando si ese patrón es encontrado en varias ocasiones. De cualquier forma esta puntuación es un algoritmo interno de la base de datos.

  7. Algunos problemas. Las búsquedas realizadas con MATCH ...AGAINST en ocasiones fallan cuando el término a buscar contiene una sola palabra. Por el contrario son unas búsquedas rapidísimas que producen mejores resultados que otros métodos mas rudimentarios como el LIKE cuando se trata de varias palabras o frases.

  8. La solución que le he dado a ese problema de las búsquedas con MATCH...AGAINST has sido chequear el número de palabras a buscar, utilizando una búsqueda simple con LIKE en el caso de una sola palabra, y el método 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_query($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>";;
      }
    ?>

Enlaces para completar esta información:
http://www.fabio.com.ar/verpost.php?id_noticia=959
http://dev.mysql.com/doc/mysql/en/Fulltext_Search.html


* ¿Necesitas contenido? Puedes usar este artículo en tu web, o en tú boletín de correo. El único requisito es incluir la siguiente línea: "Artículo realizado por Alfredo Anaya e incluir un enlace a www.adrformacion.com/catalogo.php?codcurso=PHP - Curso de php online".

 

Jordi Bassagañas29-07-2008

Hola,

En este momento estoy haciendo un buscador con PHP y MySQL y tengo un problema: ¿cómo deben ser las tablas MySQL?

Como ya ha dicho alguna persona en este sitio, en MySQL hay dos tecnologías para el almacenamiento de datos: MyISAM e InnoDB. La primera se utiliza cuando las tablas van a ser objeto de muchas consultas; la segunda da soporte a transacciones, integridad referencial, etc y se usa s****do cuando las tablas son objeto de consultas INSERT o UPDATE.

Pues bien, si los usuarios pueden hacer tantas consultas SELECT como INSERT... ¿Qué tipo de tabla se usa en estos casos? Como no sé decidirme ****inguna, estoy pensando en utilizar InnoDB para todo y duplicar el contenido que se va a consultar en tablas MyISAM.

Haciendo esto, parece que tenemos todo: InnoDB nos da la integridad referencial y el soporte a transacciones, y MyISAM proporciona la funcionalidad para las búsquedas. Por otra parte, si hago esto, la base de datos va a crecer bastante... y no sé si de forma innecesaria. ¿Qué se puede hacer en estos casos?

¡Muchas gracias y saludos!

Yo21-02-2008

aunq sea dale el credito a desarrolloweb, ta igualito igualito

C. Pa.16-11-2007

'.'

C. Pa.16-11-2007

...

Programar un buscador con php y mysql
vsvsdvsdsdsdds15-11-2007

escriba aquí su comentario...

Programar un buscador con php y mysql
jerico18-05-2007

funciona bien para tablas tipo myisam pero el fulltext no funciona en innob que solucion podrias dar al respecto, gracias

Programar un buscador con php y mysql
svqqsx25-04-2007

Hello! Thank you for your site. I have found here much useful information.
studenti it lavatrice cane ringtones al4a com formula 1 corso inglese giochi sexy online cerca nel web auto lavoro roma ciaoamigos italy msn homepage aerei calendario splinter cell evento ilary blasi wife dc
Good bye.

Programar un buscador con php y mysql
fhwzog25-04-2007

Hi, I have been looking for sites like this for a long time.

Thank you!

Programar un buscador con php y mysql
tqbxgc24-04-2007

Hello! This is very interesting site.

Good luck.

Programar un buscador con php y mysql
xblytw24-04-2007

Hi, excellent site, added to favorites!

I'll be back.

Programar un buscador con php y mysql
mdwyzh24-04-2007

Hi, cool! Nice work.

Good bye.

Programar un buscador con php y mysql
mdwyzh24-04-2007

Hi, cool! Nice work.

Good bye.

Programar un buscador con php y mysql
zssphq20-04-2007

Hello, Greetings!

Good bye.

RE: Programar un buscador con php y mysql
para los que no pueden solucion19-02-2007

Es cierto este codigo tiene errores si desean descargar la modificacion pueden entrar en esta direccion y descargar
http://es.geocities.com/rico_sercomp/fuentedephp.doc

escribame ami correo ulderico_es@hotmail.com

cusco peru
2007

RE: Programar un buscador con php y mysql
Ell18-11-2006

El articulo esta bien, pero la verdad tiene algunos errores que impiden que se pueda realizar a la perfeccion el buscador, por ejemplo de donde agarran lo de "teleformacion"........EXPLIQUENLO

RE: Programar un buscador con php y mysql
Lich18-11-2006


Me parece un buen articulo, bastante claro y se facilita entenderlo, aunque me gustaria que existiera un foro para mas comentarios o dudas que se tengan.

oyfjv pvkbzuds
oyfjv pvkbzuds31-08-2006

cerjn lyrzgpfw csidvptnf xaqtr dbrcnmf prfskmd skrmugzdo

RE: Programar un buscador con php y mysql
Vonny Nogales31-05-2006

me parece muy bueno el programa pero como realizas un buscador para mas de 2 tablas?

RE: Programar un buscador con php y mysql
José Luis02-09-2004

Me parece un artículo excelente, gracias a él he conseguido mejorar mi buscador, yo empleaba el típico LIKE, pero tenia problemas ya que solo buscaba frases y además no pordía obtener un orden de preferencia en los resultados. Enhorabuena

* Los comentarios son propiedad de quien los envió, adrformación no se hace responsable de su contenido.