miércoles, 12 de septiembre de 2007

Buscador web

Una de las herramientas imprescindibles hoy en día en cualquier web es un buscador sobre los contenidos de la propia web, algo así como un Google pero restringido a los contenidos de nuestra propia web.


Para ello vamos a necesitar varias cosas:

  1. Un gestor de contenidos de nuestra web, es decir, que el contenido de la web se extraiga de tablas. Si por ejemplo nuestra web es el catálogo de productos de nuestra empresa, lo primero es tener en bd la estructura de fichas de productos.
  2. Una variable global accesible web, llamémosla $TXT-BUSQUEDA$, que contendrá el texto a buscar en los contenidos.
  3. Un formulario web para que el usuario introduzca la cadena a buscar.
  4. Uno o varios índices sobre la tabla de productos para realizar la búsqueda por trozos de palabras, todas las palabras o por alguna de las palabras.
  5. La búsqueda en sí.
  6. Un proceso accesible web que reciba la variable global $TXT-BUSQUEDA$, lance la búsqueda y muestre el html de los resultados.

Vayamos por partes.

El gestor de contenidos de nuestra web lo vamos a reducir a una tabla PRODUCTOS. En esta tabla vamos a tener los siguientes campos: Nombre, Referencia y Descripción, por ejemplo, que son los campos sobre los que haremos que actúe el buscador.


Nombre es el campo Nombre que nos crea Velneo por defecto al crear una tabla nueva junto con sus índices Nombre, Palabras y Trozos. Podemos observar cómo están configurados estos índices para tomarlos como referencia a la hora de montar nuestros propios índices.

Referencia es un campo donde introduciremos un código formado tanto por letras como por números, es decir, la referencia del artículo.

Descripción será un campo alfabético de 500 caracteres de longitud, por ejemplo, donde introduciremos una descripción mucho más amplia sobre el producto en cuestión.

Como vamos a querer buscar sobre los tres campos anteriores a la vez, necesitamos un campo que aglutine el contenido de los tres. Así podemos crear un campo TXT-BUSQUEDA Alfa 40 de longitud 500, lo que nos da un total de 750 caracteres, con contenido inicial la concatenación de los tres campos anteriores en cuestión; "" + %NOMBRE% + " " + %REFERENCIA% + " " + %DESCRIPCION%

Ahora necesitamos, por hacerlo fácil, dos índices: uno para buscar por palabras y otro para buscar por trozos de palabras, es decir, por aproximación alfabética ternaria (pones un mínimo de tres letras y la búsqueda ya responde).

Para ello crearemos un nuevo índice PALABRAS-TEXTO-BUSQUEDA, por ejemplo, que será del tipo Palabras sobre el campo TXT-BUSQUEDA.

El segundo índice será TROZOS-TEXTO-BUSQUEDA, del tipo Aproximación alfabética ternaria sobre el mismo campo TXT-BUSQUEDA.

Con esto ya tenemos la estructura de bd necesaria para poder realizar la búsqueda.

Veamos ahora la búsqueda.


Crearemos un nuevo objeto búsqueda que llamaremos BUSCADOR. Esta búsqueda la vamos a configurar en principio para realizar una búsqueda por palabras, así incluiremos en la misma los índices CODIGO con Modo de búsqueda Todo el fichero, y como segundo índice el PALABRAS-TEXTO-BUSQUEDA en Modo Mezcla Cruzar.

Si como segundo índice de la búsqueda incluimos TROZOS-TEXTO-BUSQUEDA en Modo Mezcla Cruzar habremos configurado la búsqueda para que responda por ternas de caracteres.


En cualquiera de los dos casos, debemos indicar como contenido inicial del segundo índice en la búsqueda el contenido de la variable global $TXT-BUSQUEDA$.

Hago aquí un inciso para comentar las dos posibilidades que tenemos al utilizar el índice por Palabras en la búsqueda.

Si os fijáis a la hora de especificar el segundo índice de la búsqueda tenemos dos posibilidades: Todas las palabras o Alguna de las palabras. Qué quiere decir esto?

Si usamos Todas las palabras, estaremos haciendo una búsqueda tipo "Y"; que aparezca la palabra1 y la palabra2 y la palabra3.


Si en cambio usamos Alguna de las palabras, estaremos haciendo una búsqueda tipo "O"; que aparezca la palabra1 o la palabra2 o la palabra3.


Aclarado esto sigamos con nuestro buscador.


Ahora lo que vamos a necesitar es un formulario web con un campo donde el usuario introduzca la cadena de texto a buscar, y de valor a la variable global $TXT-BUSQUEDA$, y un botón BUSCAR.

Eso es algo tan simple como:

<form action="PROCESA-BUSQUEDA.PRO" method="post" name="busqueda" id="busqueda">
<input name="TXT-BUSQUEDA" id="TXT-BUSQUEDA" size="25" maxlength="150" type="text">
<input value="BUSCAR" type="submit">
<form>


Hay que fijarse en que el campo del formulario donde el usuario escribe la cadena a buscar se llama igual que la variable global $TXT-BUSQUEDA$ que va a contener esa cadena.

Otro detalle es que el botón submit del formulario no tiene nombre.

El action del formulario es el proceso PROCESA-BUSQUEDA.PRO


Este es el proceso accesible web que recibirá dentro de la variable global $TXT-BUSQUEDA$ la cadena a buscar. Dentro del proceso lo único que hemos de hacer es lanzar la búsqueda BUSCADOR, que directamente ya nos devuelve una lista de la tabla PRODUCTOS, donde se habrá encontrado la cadena $TXT-BUSQUEDA$ en alguno de los campos %NOMBRE%, %REFERENCIA% o %DESCRIPCION%.

El cómo mostrar los resultados de la búsqueda ya es cuestión de un componente html perteneciente a la tabla PRODUCTOS, que haciendo uso de las repeticiones <AVPR> muestre la lista de productos encontrados, algo como

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Resultado búsqueda</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body>
<p>Resultado de la búsqueda</p>
<p>Se han encontrado #AVPn Productos con #AVP'cadena-a-buscar'</p>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>NOMBRE</td>
<td>REFERENCIA</td>
<td>DESCRIPCION</td>
</tr>
<AVPR>
<tr>
<td>#AVP%NOMBRE%</td>
<td>#AVP%REFERENCIA%</td>
<td>#AVP%DESCRIPCION%</td>
</tr>
</AVPR>
</table>
</body>
</html>

En este ejemplo hemos visto cómo montar un buscador por palabras lo más sencillo posible.

Como ya hemos adelantado antes, esto se podría complicar más incluyendo campos en el formulario para que el usuario pudiese configurar la búsqueda para que actuase por Trozos de palabras, por Palabras y en modo "Y" u "O", habiendo incluido ambos índices en la búsqueda y condicionandolos en consecuencia, pero esto ya lo veremos otro día.

Life is soft!

7 comentarios:

  1. Qué grande eres, chaval.
    Me encanta tu blog.

    ResponderEliminar
  2. Este tipo de posts creo que pueden interesar mucho a la comunidad en general y a los 'vNuevos' en particular

    nicoosuna

    ResponderEliminar
  3. Cachis... con lo feliz que vivía yo sin ocuparme de programación web!!!

    Me estás tentando más allá de lo que puedo soportar. Tendré que ponerme a hacer pinitos con el servidor? Tendré que vencer mi aversión a tratar con html, xhtml, css, etc. No tengo ni idea de ninguno de ellos. Así que abusaré un poco y te pregunto: ¿Cual sería el orden lógico para empezar a ponerme con ellos y donde encontrar documentación seria?

    ResponderEliminar
  4. JA, JA, JA!!!

    Bienvenido Francisco, cuidado que engancha.

    El orden lógico creo que debería ser html, css, y luego xhtml + css.

    Html es fácil, css se entiende, y luego el salto a xhtml + css cuesta un poco más.

    Uno de los sitios que recuerde que a mí siempre me ha servido de mucho es http://www.w3schools.com/default.asp

    Muy organizado, muy clarito, con documentación buena y encima ejemplos.

    Te recomendaría leer http://www.w3c.es/ y estar al día de lo que allí se va publicando.

    Luego hay infinidad de blogs muy buenos sobre estos temas y por citarte uno diré http://veerle.duoh.com/ , chica por la que siento cierta "debilidad".

    Para cualquier cosa ya sabes dónde estamos.

    Un saludo,

    ResponderEliminar
  5. Eso es lo que mas temo, que me enganche!

    En fin, creo que voy a correr el riesgo. MUCHAS GRACIAS por la información. Robaré algunas horas para empezar a documentarme.

    Gracias, otra vez, y un saludo.

    ResponderEliminar
  6. Hola:
    Me parece muy interesante tu artículo. Gracias.
    Pero tengo un par o tres de dudas con respecto al siguiente párrafo:
    "Como vamos a querer buscar sobre los tres campos anteriores a la vez, necesitamos un campo que aglutine el contenido de los tres. Así podemos crear un campo TXT-BUSQUEDA Alfa 40 de longitud 500, lo que nos da un total de 750 caracteres, con contenido inicial la concatenación de los tres campos anteriores en cuestión; "" + %NOMBRE% + " " + %REFERENCIA% + " " + %DESCRIPCION%
    "
    1.- Al poner Alfa 40 en el índice... la conversión alfabético->Alfa40 la hace automáticamente o hay que utilizar alguna función?
    2.- ¿Poqué empiezas por dobles comillas la concatenación?
    3.- Si se modifica el contenido de alguno de los campos de la concatenación ¿se actualizará automáticamente el contenido del campo TXT-BUSQUEDA y por tanto el índice?, o bien hay que montar algun proceso para que esto se haga. Lo pregunto porque la concatenación está puesta en "contenido inicial".

    De nuevo te doy las gracias por tus aportaciones.

    Paco Vicente.
    pacovte@gmail.com

    ResponderEliminar
  7. Hola Paco:

    1.- Las conversiones de tipo en los índices las realiza Velneo automáticamente, no hay que hacer nada.

    2.- Empiezo la concatenación con dobles comillas por deformación profesional; cuando quieres concatenar campos en un cálculo Velneo asume como tipo de la concatenación el del primer operando, así en este caso no harían falta las dobles comillas.

    3.- Una fórmula contenido inicial se recalcula cuando cambia alguno de los campos que intervienen en la misma (he dicho campos).

    Gracias por tu interés y tus comentarios.

    Un saludo,

    ResponderEliminar