Zumbe.net

Comenzando a programar una web

Buscador con MATCH AGAINST

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á.

http://modulos.zumbe.net/imagenes/explicacion_fulltext.jpg

A continuación introducimos en nuestro documento php el código necesario para realizar la búsqueda:

Código: sql
  1. 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 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:

Código: php
  1. <?php
  2. //cadena de conexion
  3. mysql_connect("host","usuario","password");
  4. // DEBO PREPARAR LOS TEXTOS QUE VOY A BUSCAR si la cadena existe
  5. if (!empty($busqueda)){
  6.   //CUENTA EL NUMERO DE PALABRAS
  7.   $trozos=explode(" ",$busqueda);
  8.   $numero=count($trozos);
  9.   if ($numero==1) {
  10.     //SI SOLO HAY UNA PALABRA DE BUSQUEDA SE ESTABLECE UNA INSTRUCION CON LIKE
  11.     $cadbusca="SELECT  * FROM noticias WHERE titulo LIKE  ‘%$busqueda%’ OR cuerpo LIKE  ‘%$busqueda%’ LIMIT 50";
  12.   } elseif ($numero>1) {
  13.     //SI HAY UNA FRASE SE UTILIZA EL ALGORTIMO DE BUSQUEDA AVANZADO DE MATCH AGAINST
  14.     //busqueda de frases con mas de una palabra y un algoritmo especializado
  15.     $cadbusca="SELECT  * , MATCH (`titulo`,`cuerpo`) AGAINST (’$busqueda’) AS puntuacion
  16.   FROM noticias WHERE  MATCH (`titulo`,`cuerpo`) AGAINST (’$busqueda’)
  17.   ORDER  BY puntuacion DESC LIMIT 50";
  18.   }
  19.   $result=mysql_query($cadbusca);
  20.   While($row=mysql_fetch_array($result))
  21.   {
  22.     //Mostramos los titulos de los articulos o lo que deseemos…
  23.     echo $row[‘cuerpo’]." - ".$row[‘titulo’]."";
  24.   }
  25. }
  26. ?>

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

16 Marzo 2006 · Tags mySQL, php |

13 Comentarios

Lestat dice:

Eres el puto amo explicandote

Este tutorial esta en muchisimos sitios, pero en ninguno como en tu blog

felcidades y gracias


4 de Junio del 2007 a las 23:25
admin dice:

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.


4 de Junio del 2007 a las 23:35
viruX dice:

increible viejo….


30 de Septiembre del 2007 a las 18:16
Alexander dice:

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?


3 de Noviembre del 2007 a las 2:42
admin dice:

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í.


3 de Noviembre del 2007 a las 2:46
Alexander dice:

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


4 de Noviembre del 2007 a las 2:18
despistao dice:

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


10 de Enero del 2008 a las 21:20
despistao dice:

Ah,y he creado el índice FULLTEXT con los campos que deseo para la búsqueda


10 de Enero del 2008 a las 21:29
despistao dice:

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


12 de Enero del 2008 a las 0:45
admin dice:

Muchísimas gracias por esa aportación


12 de Enero del 2008 a las 1:37
costabariloche dice:

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!


10 de Febrero del 2008 a las 22:08
merolhack dice:

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


11 de Febrero del 2008 a las 20:06
admin dice:

@costabariloche: te falta una coma entre * y MATCH


12 de Febrero del 2008 a las 15:51

Escribe un comentario!

Buscador

2005-2007 Zumbe.net Creada por Alex Barros con WordPress - Licencia Reconocimiento - RSS