Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Buscar usando LIKE o Full Text Search - php/mysql

Vamos a crear un buscador que busque en una tabla de nuestra base de datos y que según el número de palabras buscadas utilice LIKE o el Full Text Search de MySQL.

Que és Full Text Search?
El Full Text Search utiliza los índices de la tabla para hacer las búsquedas y hace las comparaciones de la misma forma que se hacen en los grandes buscadores y no como una comparación sencilla y costosa en tiempo como la utilizada por el like.

El resultado que devuelve es ordenado por similitud a las palabras o cadena buscada, esto se puede hacer ya que cuando va encontrando los resultados el mismo le asigna un indice de similitud a lo buscado, con lo que podemos saber lo exacto que es el resultado.

Para crear el índice en la tabla a buscar haremos:

   ALTER TABLE noticias ADD FULLTEXT(titulo, texto);

Suponiendo que la tabla se llama noticias y los campos que queremos buscar són titulo y texto. Debemos tener en cuenta que los campos del índice solo pueden ser Char, Varchar o TEXT.

Nota: Los índices hacen que las tablas ocupen más espacio en disco peró agilizan mucho las búsquedas.

MATCH … AGAINST
Para buscar en la tabla utilizando el índice, haremos:

SELECT * FROM el índice WHERE MATCH(titulo, texto)
AGAINST ('palabras_a_buscar')

Si queremos saber noticias de similitud del resultado podemos hacer:

   SELECT * FROM noticias WHERE MATCH(titulo, texto)
   AGAINST ('palabras_a_buscar') AS similitud

Donde similitud sera el valor de aproximación a la busqueda.

Problemas del MATCH … AGAINST
El problema principal es que ens busquedas de una sola palabra acostumbra a fallar, ya que tiene un límite dado por el MySQL de busqueda de palabras mayores o iguales a 4 carácteres, por lo que si buscasemos por ejemplo PHP no tendriamos resultado. Lo que haremos es mirar si la cadena que nos llega es de una sola palabra o de más de una, en caso de ser una haremos la búsqueda usando LIKE y si es más de una usaremos MATCH … AGAINST Buscador con paginación.

 //Conectar con la base de datos,
 //también podemos poner el ADODB
 //Yo utilizo conexiones con código directamente aquí

 include ("conexion_bd.php");
        if ($p_busca!='')
        { if (!$num) $num=0;
             //Separamos las palabras usando cada espacio como separador
             //Hacemos la separación de la cadena a buscar
             $cadena_buscada=explode(" ",$p_busca);
             if (count($cadena_buscada)==1)
             {
               //Si solo hay una palabra usamos LIKE
               $sql=" SELECT SQL_CALC_FOUND_ROWS titulo, texto
                        FROM noticiasLIKE '%".$p_busca."%' OR texto LIKE '%".$p_busca."%'
                        WHERE titulo
                        LIMIT ".$num.",10";
             }
             elseif (count($cadena_buscada)>1)
             {
               //Si hay más de una palabra usaremos MATCH AGAINST
               $sql=" SELECT SQL_CALC_FOUND_ROWS titulo, texto, MATCH (titulo, texto)
                        AGAINST MATCH (titulo,AS Score FROM noticias
                                    ('".$p_busca."') texto) AGAINST ('".$p_busca."')
                        WHERE BY Score DESC LIMIT ".$num.",10";
                        ORDER
             }
               $rs = $db->Execute($sql);
               if (!$rs) echo $conn->ErrorMsg();
               else if ($rs->fields["id"])
               { while (!$rs->EOF)
                  { echo $rs->fields["titulo"].'‘.$rs->fields[”texto”];
                  } $rs->MoveNext();
     }
     else
        echo ‘No se han encontrado resultados correspondientes a su búsqueda.’;
     //Paginación
     $rs_cont=$db->Execute (”select found_rows() as total_filas”);
     if ($rs_cont->fields[”total_filas”]>10)
     { for ($i=0; $i<$rs_cont->fields[”total_filas”] && $i<50; $i=$i+10)
        { $a++;
            echo '[’.$a.’] ’;
     } }
}

Tao...

January 16, 2008 @ 12:46 pm

Hola, me agrado tu solucion al fullText… :P

tengo un problema en la paguinación :S

uso cake 1.2 no se si estes familiarizado, el caso es que ahi hay un helper llamado paginate, que te ayuda a construir la paginacion de tu aplicacion, pero no se como implementarla con fullText…
tienes idea???

gracias :D **

merolhack

February 11, 2008 @ 12:07 pm

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

Besh

March 27, 2009 @ 11:25 am

Hola que tal, te agradezco por este buscador me ha sido de gran utilidad, pero tengo un pequeño problema para paginar, ya q no toma las paginas siguientes, me gustaria que me dieras alguna ayuda para terminar el buscador….

RSS feed para comentarios en esta entrada · TrackBack URI

Comenta