Comenzando a programar una web
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 este sistema. 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:
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 tener en cuenta que para búsquedas de una sola palabra es más eficaz el tradicional LIKE.
Asà podrÃamos sugerir el siguiente archivo de búsqueda, que usa LIKE para una sola palabra y MATCH AGAINST para más de una:
Ojalá os sirva de mucho!
—————————————————
Referencias:
>> http://www.programacion.com/php/articulo/adr_buscador/
>> http://www.fabio.com.ar/verpost.php?id_noticia=959
Retocado del original que escribà en TomaToma
Eres el puto amo explicandote
Este tutorial esta en muchisimos sitios, pero en ninguno como en tu blog
felcidades y gracias
Muchas gracias, Lestat.
Intento currármelo todo lo que puedo para que sea perfectamente comprensible, dado que mi intención no es ganar pasta con publicidad, ni nada de eso, sólo enseñar a quien le interese cosas de programación que yo voy aprendiendo.
Espero verte de nuevo por aquÃ, porque pienso ampliar esta página bastante este verano.
Un saludo.
increible viejo….
Hola q tal, estoy haciendo un buscador utilizando el ejemplo anterior que habia encontrado en otro sitio, pero tengo un problema, cuando realizo la busqueda y exietn varios registros que contienen lo que yo busco, no me arroja ningun resultado, pero si solo existe uno solo registro que coincida, ese si lo muestra. ¿que estara pasando?
Pues no tengo ni idea, habrÃa que mirar el código.
Hay alguna lÃnea en PHP similar a if(mysql_num_rows($result) > 1) ?
En principio no es lógico qu ereaccione asÃ.
Este es un ejemplo de la sentencia de busqueda. Incluso lo he corrido directamente en phpadmin y me da los mismo resultados.
el buscador busca en la siguiente tabla
Create Table Tesis
(
Referencia varchar(30) Not Null,
Titulo varchar(200) Not Null,
YearPublicacion int Not Null,
Autor varchar(50) Not Null,
Carrera varchar(30) Not Null,
Resumen text,
Primary Key ( Referencia )
)ENGINE = MYISAM
aqui creo el index fulltext para poder usar la funcion match
ALTER TABLE Tesis ADD FULLTEXT( Carrera,Titulo,Resumen,Autor);
y este es un ejemplo de una sentencia generada
select Carrera,Titulo,Autor, MATCH ( Carrera ,Titulo ,Resumen ,Autor ) AGAINST (’%la informatica%’) as Resultado
From Tesis where MATCH ( Carrera,Titulo ,Resumen ,Autor ) AGAINST (’%la informatica%’) order by Resultado
Hola a tod@s
tengo un problema
creo que phpMyAdmin no me reconoce el algoritmo Match Against
Hace un par de años inserté un buscador como éste en una web que tenÃa y funcionaba perfectamente…
Desde hace un tiempo estoy trabajando en otra web e inserté el buscador pero no me funciona, luego probé en local el buscador de mi web antigua, qué hace tiempo funcionaba perfectamente, y tampoco funciona.
también ejecuté la consulta sql con el match against, pero phpMyAdmin no encuentra ningún registro y hace la consulta bien…
¿a que se puede deber?
gracias por adelantado
Un saludo
Ah,y he creado el Ãndice FULLTEXT con los campos que deseo para la búsqueda
Hola de nuevo,
he encontrado la solución al problema:
insertando “IN BOOLEAN MODE” después de la cadena de búsqueda del AGAINST de la cláusula WHERE. De este modo:
“SELECT distinct id_pelicula, titulo, titulo_original, MATCH (titulo, titulo_original)
AGAINST ( ‘%”.$search.”%’ ) AS Criterio FROM peliculas WHERE
MATCH (titulo, titulo_original) AGAINST ( ‘%”.$search.”%’ IN
BOOLEAN MODE ) ORDER BY Criterio DESC LIMIT 50″
Un saludo
MuchÃsimas gracias por esa aportación
Amigos, no logro dar con el error se sintaxis que me indica el php cuando lo corro:
1) {
//SI HAY UNA FRASE SE UTILIZA EL ALGORTIMO DE BUSQUEDA AVANZADO DE MATCH AGAINST
$query_recCliente=
“SELECT * MATCH (nombre, resenia) AGAINST (’$busqueda’) AS Score FROM cliente WHERE MATCH (nombre, resenia) AGAINST (’$busqueda’) ORDER BY Score DESC LIMIT 50″;
}
$recCliente = mysql_query($query_recCliente, $bases) or die(mysql_error().$query_recCliente);
while ($row_recCliente = mysql_fetch_assoc($recCliente))
{
?>
me da un mensaje:
You have an error in your SQL syntax near ‘MATCH (nombre, resenia) AGAINST (’aldea suiza’) AS Score FROM cliente WHERE MA’ at line 1SELECT * MATCH (nombre, resenia) AGAINST (’aldea suiza’) AS Score FROM cliente WHERE MATCH (nombre, resenia) AGAINST (’aldea suiza’) ORDER BY Score DESC LIMIT 50
¿Se dan cuenta a que se debe?
Graciass!
Hola, hice un buscador con parte del código presentado aquÃ:
http://www.guiasjoomla.com/index.php?option=com_smf&Itemid=2&topic=132.0
@costabariloche: te falta una coma entre * y MATCH