Programación en castellano
Inicio > Taller Java > Internet > Programar un buscador con PHP y MySQL
-Artículos

Programar un buscador con PHP y MySQL

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.

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.

Campos de la tabla

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

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>

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.

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);
Índices de la tabla

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.

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.

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.

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("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>";
  }
}
?>

Enlaces para completar esta información:

 

Últimos comentarios
Últimos 5 comentarios

problema (17/11/2008)

Por
hayuda cuando memeto ainternet me mustra un mensaje que dice problema de red embiar erores que ago

insertar datos en base datos (17/04/2008)

Por
Para poder insertar datos de forma automatica tienes q escribirle sentencias sql con el mysql_query.
Ej: mysql_query(insert into alumnos values...)

refinar busqueda (24/05/2007)

Por
Como hariamos en este ejemplo para realizar una busqueda que unicamente nos devuelva los resultados exactos, es decir, si busco dos palabras quiero que solo me devuelva como resultados validos aquellos registros que tengan las dos palabras, solo esos, no quiero el resto.

Http://www.easterncurio.com sell Mueble Chino Antiguo Antigüedades de China Artesanías Ant (24/04/2007)

Por
Http://www.easterncurio.com sell Mueble Chino Antiguo Antigüedades de China Artesanías Antigüedades de China Arqueológico Oriental Curiosidad Mueble Antiguo Chino Revolución Cultural China Cerámica Porcelana Vasijas Buda Arte Bronce y Cobre Bambú Piedra Talla de madera Te Chino Perla y Collar Pinturas Iluminación Mongolia y Tibet Textiles Enmarcado y molduras Muebles de Jardín Vasijas para jardín Casa de aldea Reacabado Decoradores de interior Paisaje Arquitectos Jardín Dise?adores Cenador Cestos Monederos Joyería Misceláneos Alacenas Chinas Alacenas Armarios Sillería China Mobiliario de Mongolia Muebles Alacenas para Bodegas Bancos Taburetes Mueble Chino Tallado y Biombos Puertas antiguas Ruedas Textiles Objetos de laca Tejidos Sedas articulos de seda Vestido Antiguo Objetos en laca China Vietnamita Objetos en laca tailandesa Cajas Cofres Adornos para Pared Del Tibet Joyería Cajas Piel cajas de madera cofres Pinturas Papeles pintados Posters antiguos Bordados tallas Cajas del Tibet Alacenas del Tibet Cestos Lamparas Iluminación Cubos Bandejas Linternas Chinas Lámparas Pantallas para lámparas Plata peque?as alfombras Muebles Palanganas Jardineras Estatuas Alfombras Orientales Alfombras del Tibet Mesas de café Armarios para TV Mesas Chinas Mesas altar Cloisonne Mobilario Articulos Miscelaneos Vasos Cloisonne Jaulas de Pajaros Frascos para Perfumes Cerámicas Antigüedades chinas Mueble antiguo Chino mueble chino chino alacenas chinas antigüedades orientales antigüedades arte de Asia arte asiático Comerciantes en antigüedades artefacto arte ceramica ceramicas vasijas Dinastía Ming dinastía ming Dinastía Qing dinastía qing Dinastía Ching dinastía ching mesas cestos huanghuali alacena alacenas fragmentos arquitectónicos Arcón silla cubos puerta puertas tallas retratos de antepasados Tibet Tibetano arte Tibetano cofre tibetano loza importaciones de China Santa Cruz Menlo Park armario dise?o interior decorador de interiors dise?ador de interiores Muebles de Asia y Sur América Arte para el hogar las mejores antigüedades dise?o accesorios de calidad mueble moderno fabricación Exportador reproducción de muebles mueble antiguo de Asia mueble antiguo de China rustico oriental cerámicas vasijas terracotta echo a mano regalo curiosidad oriental Mueble de Asia mueble rustico arte tribal Tibetano decoración del hogar Suministradores en Asia China de muebles antiguos chinos Muebles estilo Ming Qing porcelana talla estatua mueble antiguo oriental mueble antiguo de China mueble tradicional Chino muebles de estilo clásico rustico Reproducciones reproducción de muebles joyería del Tibet Accesorios antiguos Asiáticos arte popular pinturas Asiáticas artesanías orientales artesanías de Oriente ajuares piedras preciosas Antiguedad de China antiguedades tradicionlaes Muebles antiguos Chinos tradicionale articulos para el hogar y jardín regalo de China regalos muebles sólidos de maderas duras consumible tallas terracotta tallas de buda decoración manufactura y suministrador FLORON TIRADOR TIRADORES HERRAJES
http://www.easterncurio.com
http://www.chineart.com
http://www.antiquesbeijing.com
email: info@easterncurio.com
tel:0086-13621990301
0086-13901685220

como es elcodigo pra ingresardatos en php (24/04/2007)

Por
buenas estoy intentando montar un sitio en php perono se como hacer codigo de ingreso de datos.. todo lo estoy havciendo consultando en internet pues mi cono cimiento acerca de php es poco.... gracias
 
Tienda
Patrocinados
 

Copyright © 1999-2007 Programación en castellano. Todos los derechos reservados.
Formulario de Contacto - Datos legales - Publicidad

Hospedaje web y servidores dedicados linux por Ferca Network

red internet: musica mp3 | logos y melodias | hospedaje web linux | registro de dominios | servidores dedicados
más internet: comprar | recursos gratis | posicionamiento en buscadores | tienda virtual | gifs animados