Búsquedas de coincidencias con php y MySQL

Búsquedas de coincidencias con php y MySQL

En el siguiente articulo, vamos a estudiar las distintas formas mediante las cuales podemos realizar búsquedas en campos de nuestras tablas MySQL.

 

Este articulo es muy útil para crear un buscador interno para nuestra página Web, para filtrar resultados de una consulta… etc.

 

En primer lugar, MySQL cuenta con dos métodos para realizar consultas. El primero utilizando el comando LIKE, que solo sirve si el término que buscamos en nuestro campo solo consta de una palabra. En cambio, MATCH AGAINST permite la búsqueda o comparación de varias palabras a la vez; sin embargo, tenemos que agregar o convertir los campos de la tabla MySQL que deseamos comparar a FULLTEXT.

 

El primer método la implementaríamos de la siguiente manera:

 

SELECT campo1,campo2 FROM tabla WHERE campo_comparar1 LIKE '%palabra_clave%' OR campo_comparar2 LIKE '% palabra_clave %'

 

A grandes rasgos, Selecciona los campos (campo1,campo2,…) DE la tabla DONDE el campo a comparar (campo_comparar1) sea “IGUAL” a la palabra que buscamos (palabra clave). También podemos incluir más campos en los que buscar con un OR, por ejemplo, si tenemos una tabla con dos campos (titulo_noticia, contenido_noticia) y queremos buscar coincidencias en el titulo y en el contenido.

 

El segundo método es un poco más complejo. En primer lugar, tenemos una tabla llamada noticias con los siguientes campos:

 

Id_noticia

Titulo_noticia

Contenido_noticia

 

Para realizar una búsqueda necesitaremos convertir los campos Titulo_noticia y Contenido_noticia a FULLTEXT.

 

ALTER TABLE noticias ADD FULLTEXT(Titulo_noticia, Contenido_noticia);

 

Ahora ya podemos realizar búsquedas MATCH AGAINST.

 

SELECT campo1,campo2 , MATCH (campoFULLTEXT1, campoFULLTEXT2)

                        AGAINST ('+palabras_clave*' IN BOOLEAN MODE) AS Score FROM tabla WHERE MATCH (campoFULLTEXT1, campoFULLTEXT2) AGAINST ('+palabras_clave*' IN BOOLEAN MODE) ORDER BY Score DESC

 

En el caso que estamos tomando como ejemplo seria:

 

 

SELECT Id_noticia,Titulo_noticia,Contenido_noticia , MATCH (Titulo_noticia,Contenido_noticia)

                        AGAINST ('+palabras_clave*' IN BOOLEAN MODE) AS Score FROM noticias WHERE MATCH (Titulo_noticia,Contenido_noticia) AGAINST ('+palabras_clave*' IN BOOLEAN MODE) ORDER BY Score DESC

 

Si bien esta segunda forma es más completa y mejor, a veces falla para la búsqueda de una sola palabra. Para resolver esto, nosotros crearemos un condicional que utilice LIKE si el string de búsqueda es de una sola palabra o que utilice MATCH AGAINST si el string es de varias palabras.

 

Código php:

 

//Conexion a DB Mysql

$DB_HOSTNAME  = "";                            #SERVIDOR#

$DB_USERNAME   = "";                            #USUARIO#

$DB_PASSWORD  = "";                            #CONTRASEÑA#

$DB_NAME             = "";                            #BASE DE DATOS#

 

$cnx = mysql_connect($DB_HOSTNAME, $DB_USERNAME, $DB_PASSWORD) or die(mysql_error());

mysql_select_db($DB_NAME, $cnx)or die(mysql_error());

 

$key_words    = $_GET['key_words'];

 

if(strlen($key_words)>1){//No realizamos búsqueda si la palabra es de un solo caracter

            if($key_words){

           

                        //Contamos el numero de palabras que incluye la búsqueda.

                        $frac    = explode(' ',$key_words);

                        $no                  = count($frac);

                       

                        //Si la búsqueda tiene una palabra utilizamos LIKE sino MATCH AGAINST.

                        if($no == 1){

                                   $sql = " SELECT Id_noticia,Titulo_noticia,Contenido_noticia FROM noticias WHERE Titulo_noticia LIKE '%$key_words%' OR Contenido_noticia LIKE '%$key_words%'";

                        }else{

                                   $sql = "SELECT Id_noticia,Titulo_noticia,Contenido_noticia , MATCH (Titulo_noticia,Contenido_noticia)

                        AGAINST ('+".$key_words."*' IN BOOLEAN MODE) AS Score FROM noticias WHERE MATCH (Titulo_noticia,Contenido_noticia) AGAINST ('+".$key_words."*' IN BOOLEAN MODE) ORDER BY Score DESC";

                        }

                       

                        //Ejecutamos el codigo Mysql

                        $r = mysql_query($sql,$cnx) or die("La consulta a nuestra base de datos es erronea.".mysql_error());

                       

                        if(mysql_num_rows($r)){//Si existen resultados

                                   while(list($id_not,$title_not,$content_not) = mysql_fetch_array($r)){

                                               print("ID de la noticia: $id_not
Título: $title_not
Contenido: $content_not

");

                                   }

                        }else{//Si no existen resultados

                                   print("No se encontraron resultados.");

                        }

            }else{//Si no existen palabra clave

                        print("No existen palabras clave.");

            }

}else{//Si la palabra clave solo tiene un caracter

            print("Palabra clave demasiado corta.");

}

?>

Ahora ya sabemos como realizar búsquedas a nuestra propia información. Sin amargo, este método nos permite crear un buscador si nuestra Web es dinámica y todo el texto esta guardado en una base de datos MySQL. Si tenemos una Web con el contenido estático en varios archivos HTML no lo podríamos aplicar.

 

Una solución a este problema seria guardar todo el contenido de los archivos HTML en una tabla como la que estamos tomando de ejemplo y realizar las consultas aprendidas sobre esta tabla. Desde programación sitios Web hemos realizado un script en php que permite crear esta operación de una manera muy simple y rápida. Este script, pide al usuario un archivo XML con las urls de las paginas que deseas guardar en la tabla y los datos de su base de datos, y crea una tabla llamada “search” con los campos:

 

page_ID //identificador de la pagina

page_TITLE //titulo de la pagina

page_CONTENT //contenido de la pagina

page_URL //la dirección Web de la pagina

Si queremos aplicar el ejemplo anterior a la tabla “search” cambiaríamos las siguientes líneas:

 

if ($no==1) {

            $sql="SELECT page_ID,page_TITLE,page_CONTENT,page_URL FROM search WHERE page_TITLE LIKE '%$key_words%' OR page_CONTENT LIKE '%$key_words%'";

}else{

            $sql="SELECT page_ID,page_TITLE,page_CONTENT,page_URL , MATCH (page_TITLE,page_CONTENT)

                        AGAINST ('+".$key_words."*' IN BOOLEAN MODE) AS Score FROM search WHERE MATCH (page_TITLE,page_CONTENT) AGAINST ('+".$key_words."*' IN BOOLEAN MODE) ORDER BY Score DESC";

}

 

Ver el ejemplo en funcionamiento.

 

El script que vuelca los HTML a la tabla MySQL lo podéis obtener de nuestra sección de scripts, esta con licencia GNU y podéis comprobar el código vosotros mismos. 

COMENTARIOS


[No hay comentarios]


Deja un comentario

Los comentarios no pueden contener ninguna etiqueta xhtml.


Valoración del articulo: 0 1 2 3 4 5


DEBES ESTAR REGISTRADO PARA ENVIAR COMENTARIOS
REGISTRATE!

MANUALES REFERIDOS AL MISMO TEMA

Como crear un buscador interno para tu Web.


ARTICULOS REFERIDOS A LA MISMA CATEGORIA

Búsquedas de coincidencias con php y MySQL.

MooSearch – Un buscador interno para tu Web.

Buscador sin MySQL utilizando php.



SCRIPTS CLASIFICADOS

HTML to MySQL (para buscador interno).

mooSearch - rc1.

mooSearch - rc2.



LECTURA RECOMENDADA

NUESTROS LIBROS

Flash, PHP y MySQL. Contenidos Dinámicos - Anaya.

Desarrollo Web con PHP y MySQL - Anaya.

Diseño de páginas web - Anaya Ed.2001.

Google adds Google adds Google adds Google adds