Hace tiempo estaba trabajando en una web con una base de datos y me propuse hacer un buscador muy potente, y buscando por la red encontré un sistema de búsqueda muy bueno: el "MATCH AGAINST"
A continuación os explico para quien no lo conozca cómo funciona. Consigue resultados similares a los buscadores profesionales, como Google. Eso sí, requiere una experiencia mínima con php y MySql.
------------------------------------------------------
Partimos suponiendo que tenemos una tabla llamada noticias con los campos titulo (Varchar) y cuerpo (text).
Pues bien, lo primero que hacemos es crear un índice de tipo
Fulltext.
Par hacerlo basta con introducir la sentencia
ALTER TABLE noticias ADD FULLTEXT(titulo, cuerpo);
Si tenemos PhpMyAdmin basta con ir a la tabla deseada y abajo a la izquierda de la pantalla estan definidos los índices. Pulsa en Crear un índice en 2 columnas Continúe
Después ponéis nombre al índice (buscar, por ejmplo), seleccionais tipo de indice:FULLTEXT y seleccionáis los campos titulo y cuerpo, pulsa a grabar y ya está.

A continuación introducimos en nuestro documento php el código necesario para realizar la búsqueda:
|
Código: |
|
SELECT * , MATCH (`titulo`,`cuerpo`) AGAINST ('$busqueda') AS puntuacion FROM noticias WHERE MATCH (`titulo`,`cuerpo`) AGAINST ('$busqueda') ORDER BY puntuacion DESC LIMIT 50 |
Traduciendo: Selecciona todos los campos cuya fila coincida en título o cuerpo con la variable $busqueda, y ordena por puntuación en orden descendiente. Muestra solo los 50 resultados.
Puntuacion es un valor que asigna interiormente la base de datos a cada resultado, cuanta más similitud con $busqueda tenga el resultado más puntuación tiene (valor decimal de 0 a 1). Aquí reside lo especial de este sistema: muestra las coincidencias literales y las similares en orden de similitud.
Así si has escrito por ejemplo "Reproductor Sony" en el buscador, aparecería primero uno que podría llamarse "El nuevo reproductor sony" y a continuación uno llamado "Cómo usar un reproductor de Mp3", etc
Pero hay que tene en cuenta que para búsquedas de una sola palabra es más eficaz el trdicional LIKE.
Así podríamos sugerir el siguiente archivo de búsqueda:
|
Código: |
|
<?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 * FROM noticias WHERE titulo LIKE '%$busqueda%' OR cuerpo 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 * , MATCH (`titulo`,`cuerpo`) AGAINST ('$busqueda') AS puntuacion FROM noticias WHERE MATCH (`titulo`,`cuerpo`) AGAINST ('$busqueda') ORDER BY puntuacion DESC LIMIT 50"; } $result=mysql("teleformacion", $cadbusca); While($row=mysql_fetch_object($result)) { //Mostramos los titulos de los articulos o lo que deseemos... $cuerpo=$row->cuerpo; $titulo=$row->titulo; echo $cuerpo." - ".$titulo."<br>"; } } ?> |
Ojalá os sirva de mucho!
Espero comentarios!!
__________________________________ Referencias:
>> http://www.programacion.com/php/articulo/adr_buscador/
>> http://www.fabio.com.ar/verpost.php?id_noticia=959