Sei sulla pagina 1di 5

c 

 
    
      
Supongo al lector familiarizado con la programación en php y la administración básica
de Mysql.

1. 3omo punto de partida, la información a buscar la tenemos que tener


almacenada en una tabla de nuestra base de datos. Pongamos como ejemplo una
tabla con artículos técnicos que llamaremos ARTI3 S. Esta tabla
ARTI3 S tendrá como mínimo dos campos llamados TIT  y
DESARR, que almacenarán el título del artículo y su contenido
respectivamente.

os tipos de los campos a buscar deberán ser 3AR, VAR3AR o TEXT con
sus variantes.

2. Ahora diseñaremos una página con un formulario y una caja de texto para
escribir la cadena de consulta "  " y llamar al script de búsqueda
" ". Ejemplo:

<FORM METHOD=POST ACTION="buscar.php">


Buscar: <INPUT TYPE="text" NAME="busqueda">
</FORM>

3. En el fichero   es donde está el click de la cuestión.


ay que hacer la consulta que busque las palabras y devuelva como resultado
los registros coincidentes. asta aquí parece fácil y podríamos resolverlo así:

SELECT * FROM ARTICULOS WHERE DESARROLLO LIKE '%$busqueda%' OR


TITULO LIKE '%$busqueda%'

Pues esta consulta nos mostrará todos los artículos que en su titulo o en su
contenido aparezca la frase de búsqueda tal y como nosotros la introducimos.
Esto es muy limitado ya que un cambio en el orden de las palabras o un artículo
de separación dará al traste con nuestra búsqueda no mostrando los resultados
deseados.
Si bien podríamos depurar y mejorar la sintaxis de nuestra búsqueda utilizando
el operador IKE las búsquedas resultarían muy lentas y no tendrían el resultado
esperado.

4. a solución mas eficiente es utilizar los índices F TEXT específicamente


indicados para estos menesteres. Pues bien esto implica ir a nuestra base de
datos, y crear un indice F TEXT con todos los campos que deseamos incluir
en nuestra busqueda, que en nuestro caso son TIT  y DESARR. Para
ello basta con el phpmyadmin o bien escribir la instrucción directamente:
ALTER TABLE ARTICULOS ADD FULLTEXT(TITULO, DESARROLLO);

5. na vez creado el índice la instrucción SQ para buscar será:

SELECT * FROM ARTICULOS WHERE MATCH(TIT ULO, DESARROLLO) AGAINST


('$busqueda')

Esta línea utiliza la función MAT3 ... AGAINST ... que encuentra el texto
buscado, usando consultas en lenguaje natural parecido a como lo hacen los
motores de búsqueda. Además, se calcula internamente una puntuación en
función de como aparecen los términos buscados dentro de nuestro artículo.

6. Perfeccionando la búsqueda:

SELECT * , MATCH (TITULO,DESARROLLO) AGAINST ('$busqueda')


AS puntuacion FROM ARTICULOS WHERE MATCH (TITULO, DESARROLLO)
AGAINST ('$busqueda') ORDER BY puntuacion DESC LIMIT 50

Esta línea devuelve los 50 primeros resultados encontrados ordenados de mas a


menos puntuación. El valor de la puntuacion es un número decimal
comprendido entre 0 y 1 por cada ocurrencia del patrón de búsqueda, que se irá
sumando si ese patrón es encontrado en varias ocasiones. De cualquier forma
esta puntuación es un algoritmo interno de la base de datos.

7. Algunos problemas. as búsquedas realizadas con MAT3 ...AGAINST en


ocasiones fallan cuando el término a buscar contiene una sola palabra. Por el
contrario son unas búsquedas rapidísimas que producen mejores resultados que
otros métodos mas rudimentarios como el IKE cuando se trata de varias
palabras o frases.

8. a solución que le he dado a ese problema de las búsquedas con


MAT3...AGAINST has sido chequear el número de palabras a buscar,
utilizando una búsqueda simple con IKE en el caso de una sola palabra, y el
método MAT3...AGAINST en el caso de varias. Ejemplo del fichero
 

<?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 PAL ABRA DE BUSQUEDA SE ESTABLECE UNA
INSTRUCION CON LIKE
$cadbusca="SELECT REFERENCIA, TITULO FROM ARTICULOS WHERE
VISIBLE =1 AND DESARROLLO LIKE '%$busqueda%' OR TITULO LIKE
'%$busqueda%' LIMIT 50";
} elseif ($numero>1) {
//SI HAY UNA FRASE SE UTILI ZA EL ALGORTIMO DE BUSQUEDA
AVANZADO DE MATCH AGAINST
//busqueda de frases con mas de una palabra y un algoritmo
especializado
$cadbusca="SELECT REFERENCIA, TITULO , MATCH ( TITULO,
DESARROLLO ) AGAINST ( '$busqueda' ) AS Score FROM ARTICULOS
WHERE MATCH ( TITULO, DESARROLLO ) AGAINST ( '$busqueda' )
ORDER BY Score DESC LIMIT 50";
}
$result=mysql_query($cadbusca);
While($row=mysql_fetch_object($result))
{
//Mostramos los titulos de los articulos o lo que deseemos...
$referencia=$row ->REFERENCIA;
$titulo=$row ->TITULO;
echo $referencia." - ".$titulo."<br>";;
}
?>

 
ace mucho que no hago un post para programadores, pero hoy vuelvo y con un poco
de SQ que muchos no tienen tan claro...
Para el que le interese hacer un buscador en MySQ hay una herramienta que tienen en
todos sus MySQ y que pocos usan.
a maldita costumbre del "ike" hace que se olviden de usar índices y full text search,
acá les dejo un poco como es la idea.

Si tenemos una tabla con nuestras noticias donde hay un título y un cuerpo principal de
la nota, titulo y cuerpo, primero hay que asegurarse que sean Varchar o TEXT , no usar
BB para esto, no sirve.

    
 
ALTER TABLE notas ADD FULLTEXT(titulo, cuerpo);

ahí se crea el índice para la búsqueda, esto puede ocupar un poco más de espacio pero lo
importante se ve en el resultado de la búsqueda. Más rápida y eficiente que un ike,
simplemente funciona como un buscador y no como una comparación sencilla y costosa
como el like.

‰  
SELECT * FROM notas
WHERE MATCH(titulo, cuerpo) AGAINST ('Paleta')

donde 'Paleta' es nuestra palabra de búsqueda nos podrá traer inclusive frases o más de
una palabra (el like se muere si le hacen eso)

Pero si además quieren ordenarlo por "rating" u orden de importancia de la búsqueda:


SELECT * , MATCH(titulo, cuerpo) AGAINST ('Paleta') as Score
FROM notas
WHERE MATCH(titulo, cuerpo) AGAINST ('Paleta')
ORDER BY Score DESC

(obviamente nunca usen *, ahí pongan los campos que van a usar)

Score tiene un valor que no se bien como se calcula pero nos da un orden coherente de
lo que se encontró tal cual hacen algunos buscadores que imprimen un porcentaje o un
valor de "acierto"

ë    

El límite de búsqueda está configurado en el MySQ y por lo general es de 4 caracteres,


así que si quieren buscar algo simple como... PP! no lo van a poder encontrar y no va
a emitir ningún resultado. Sucede eso con las búsquedas demasiado simples que resulten
en un 50% de las posibilidades de encontrar, directamente da resultado nulo. Así que
ese es el único detalle en contra pero a favor que busca muy rápido y más
eficientemente además de que el resultado es el que queríamos.

Potrebbero piacerti anche