viernes, 19 de junio de 2015

Como indexar registros de una base MARC de ABCD para buscadores en Internet.

El propósito de una base bibliográfica gestionada mediante un catálogo, es poner a disposición su información para los usuarios y otros sistemas. En este contexto, mientras más visibilidad tengan nuestros registros entonces existe mayor posibilidad de que los usuarios encuentren lo que están buscando, y como sabemos, en la actualidad los motores de búsqueda como Google son muy frecuentados para estos fines; entonces, ¿Porque no poner nuestros registros MARC de nuestra base de datos en buscadores como este? después de todo, Google indexa todas las páginas HTML (u otras estructuras basadas en etiquetas) de Internet que cumplan con un estándar, caso similar de lo que ocurre con repositorios en los cuales sus metadatos están disponibles en una estructura estandarizada de etiquetas que permite que sean encontrados.

Para quienes conocemos un poco el sistema ABCD, sabemos que sus registros se encuentran administrados por un motor ISIS que gestiona la creación y edición de la información con la que puede estar alimentada una base de datos bibliográfica, dichos registros son almacenados en archivos de texto .mst y .xrf., pero estos no son visibles en Internet o por motores de búsqueda, y en realidad eso está bien, ya que esa es la función de una base de datos, almacenar los registros de una manera ordenada / lógica y tenerlos a disposición de programas intermedios que gestionan la visibilidad de los mismos hacia los usuarios y otros sistemas.

Para nuestro caso en particular, y como objeto de esta entrada, se trata de extraer los registros de una base de datos en estructura MARC de ABCD para que puedan ser indexados por motores de búsqueda usando una disposición de etiquetas HTML y estructuras del estándar Meta Tags de Dublin Core (http://www.metatags.org/dublin_core_metadata_element_set) con los datos de cada registro. Además, se presentarán bloques de código que indican en líneas generales como programar un módulo PHP que realice la tarea.

A continuación un esquema de lo que se pretende:

conversor MARC a HTML
Estructura del proceso de extracción y conversión de los registros MARC a HTML
Como se visualiza en la esquema, se tiene el siguiente proceso:
  1. Extracción con mx: se extraen los registros de la base MARC del sistema ABCD mediante el utilitario mx recorriendo todos los MFN existentes.
  2. Formateado del registro: Cada registro extraído por mx es formateado para armar la estructura HTML con Meta Tags utilizando los datos de ese registro.
  3. Conversión del registro: el resultado es manipulado por código php que permite la conversión previa de caracteres y el guardado del registro en un archivo con extensión .html.
  4. Publicación: todos estos archivos generados son almacenados en una carpeta pública en Internet que puede ser visible por buscadores y usuarios.
Extracción con MX.

Los registros deben ser extraídos de la base MARC mediante una sentencia de comando que ejecuta el utilitario mx pidiendo la extracción de un registro de una base determinada con un formato específico, el comando mx es:

     [directorio mx]\mx [directorio data de base marc] marc from=1 to=1 pft=@[directorio del archivo PFT] -all now

Por lo general la sentencia en entornos windows resulta:

     C:\ABCD\www\cgi-bin\mx C\:ABCD\www\bases\marc\data marc from=1 to=1 pft=@C:\ABCD\www\bases\narc\pfts\es\conversor.pft -all now

Si hemos instalado ABCD es probable que el directorio de mx esté incluido en la variable de sistema Path, lo cual no hace necesario especificar el directorio al momento de ejecutar el comando. Por otro lado, las propiedades from= y to= especifican el rango de MFN a ser extraídos, para nuestro ejemplo, estos deben ser especificados de uno en uno de manera automática. Finalmente, el archivo conversor.pft contiene el formato HTML y de Meta Tags que serán aplicados a la información del registro.

Para poder extraer todos los registros de manera automática, usaremos un módulo de PHP que ejecutará el comando y recibirá el resultado en un array, al archivo lo llamaremos conversor.php:
  • Primero, debemos saber el total de MFNs de la base. Estoy seguro que el proceso que presento a continuación puede ser mejorado por un experto en ABCD, el conversor.php debe contener:
<?php

//DECLARAMOS LAS RUTAS DE WXIS.EXE, MX Y DEL DIRECTORIO DE LAS BASES DE DATOS
$ruta_isis = "localhost:9090/cgi-bin/wxis.exe";
$path_mx = "C:/ABCD/www/cgi-bin";
$db_path="C:/ABCD/www/bases/";

//RECUPERO CANTIDAD DE MFN DE LA BASE, BUSCAR PROCESO MÁS SIMPLE
$url = $ruta_isis."/?IsisScript=conversor/mfn.xis";
get_file($url,"","mfn.txt");
$gestor = fopen("mfn.txt", "r");
$contenido = fread($gestor, 512);
fclose($gestor);
$posicion_mfn = strpos($contenido,"|");
$mfn = substr($contenido, 0, $posicion_mfn);

function get_file($file, $local_path, $newfilename) 

{

//función de prueba para extraer MFN

$out = fopen($local_path.$newfilename,"wb");

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_FILE, $out); 

curl_setopt($ch, CURLOPT_HEADER, 0); 

curl_setopt($ch, CURLOPT_URL, $file);

curl_exec($ch); 

curl_close($ch);

}
?>

El código extrae la cantidad de MFNs de la base consultando un archivo mfn.xis que debe estar en el sistema ABCD (la ruta del archivo está especificada en el código) que contiene lo siguiente:

<IsisScript>
<section>
<display><pft>'Content-type: text/html'/#</pft></display>
<do task = mfnrange>
<field action=define tag=1010>Isis_Total</field>
<parm name=db>marc</parm>
<parm name=from>1</parm>
<parm name=to>1</parm>
<parm name=cipar>
<pft>
'marc.*=C:\ABCD\www\bases\marc\data\marc.*'/
</pft>
</parm>
<loop>
</loop>
<display><pft>
v1010,'|'
</pft></display>
</do>
</section>
</IsisScript>

Si corremos el archivo conversor.php en un explorador web, tendremos una variable $mfn que contiene la cantidad de registros de la base ABCD que deben ser procesados iterativamente.
  • Segundo, adjuntamos al código de conversor.php el procesos que extraerá los MFNs:
//PROCESO DE CREACIÓN DEL HTML EN BASE A LA CANTIDAD DE $mfn
$contador = 1;
while ($contador <= $mfn)
{
//sacamos cada registro de la base marc usando un PFT con el formato en HTML y estructura meta tag de DublinCore
$mx = $path_mx."\mx ".$db_path."marc/data/marc from=$contador to=$contador pft=@C:\ABCD\www\bases\marc\pfts\es\conversor.pft -all now 2>&1";
exec($mx, &$outmx);
$nuevoarchivo = fopen($contador.".html", "w+");
$posiciones_array = count($outmx);
$contador_posiciones = 0;
while ($contador_posiciones <= $posiciones_array-1)
{
//Guardo cada salida del array convirtiendo la codificación
$outmx[$contador_posiciones] = mb_convert_encoding($outmx[$contador_posiciones], "UTF-8", "ascii");
fputs($nuevoarchivo,$outmx[$contador_posiciones]);
$contador_posiciones ++;
}
fclose($nuevoarchivo);
$outmx = NULL;
$contador ++;
}

Formateado del Registro.

El bloque de código recién adicionado, hace el llamado al comando mx que extrae los registros de manera interativa recorriendo el total de MFNs de la base usando un archivo conversor.pft que contiene el formato para el archivo HTML a ser generado.

Hay que tener en cuenta que lo que se pretende hacer es que conversor.pft arme la estructura de tags HTML y Meta Tags de Dublin Core usando la información de cada registro, para esto se llama a cada campo de la base MARC en cada etiqueta correspondiente de meta tag. En cada caso, y para cada base, se tendrán campos diferentes ya que se pretende que este método no solamente funcione para bases MARC si no para estructuras de cualquier tipo que se creen en ABCD.

Un ejemplo corto de lo que se extrae usando conversor.pft es:

'<html>'/
'<head>'/
'<title>'mfn(6)'</title>'/
'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'/
'<meta name="Generator" content="ABCD">'/
'<meta name="viewport" content="width=device-width, initial-scale=1.0">'/
'<link rel="schema.DCTERMS" href="http://purl.org/dc/terms/">'/
'<link rel="schema.DC" href="http://purl.org/dc/elements/1.1/">'/
if p(v100) then '<meta name="DC.creator" content="'v100^a'">' fi/
if p(v700) then '<meta name="DC.creator" content="'v700^a+|"><meta name="DC.creator" content="|'">' fi/
if p(v110) then '<meta name="DC.creator" content="'v110^a'">' fi/
if p(v710) then '<meta name="DC.creator" content="'v710^a+|"><meta name="DC.creator" content="|'">' fi/
'<meta name="DCTERMS.dateAccepted" content="'mid(v5,1,4)'-'mid(v5,5,2)'-'mid(v5,7,2)'T14:37:32Z">'/
if p(v260) then '<meta name="DCTERMS.issued" content="'v260^c'">' fi/
'<meta name="DC.identifier" content="http://localhost:9090/cgi-bin/wxis.exe/iah/scripts/?IsisScript=iah.xis&lang=es&base=MARC&nextAction=extsearch&exprSearch='v998^a'">'/
if p(v520) then '<meta name="DC.description" content="'v520^a'">' fi/
if p(v856^u) then '<meta name="DC.format" content="application/pdf">' fi/
if p(v653) then '<meta name="DC.subject" content="'v653^a+|"><meta name="DC.subject" content="|'">' fi/
if p(v245) then '<meta name="DC.title" content="'v245^a if p(v245^b) then ': 'v245^b fi '">' fi/
if p(v520) then '<meta name="DC.description" content="Cuenca">' fi/
'<meta name="citation_abstract_html_url" content="http://localhost:9090/cgi-bin/wxis.exe/iah/scripts/?IsisScript=iah.xis&lang=es&base=MARC&nextAction=extsearch&exprSearch='v998^a'">'/
if p(v100) then '<meta name="citation_authors" content="'v100^a'">' fi/
if p(v700) then '<meta name="citation_authors" content="'v700^a+|"><meta name="DC.creator" content="|'">' fi/
if p(v110) then '<meta name="citation_authors" content="'v110^a'">' fi/
if p(v710) then '<meta name="citation_authors" content="'v710^a+|"><meta name="DC.creator" content="|'">' fi/
if p(v856^u) then '<meta name="citation_pdf_url" content="'v586^u'">' fi/
if p(v653) then '<meta name="citation_keywords" content="'v653^a+|, |'">' fi/
'<meta name="citation_title" content="'v245^a'">'/
'<script language="Javascript">'/
'location.href="http://sibuc.ucuenca.edu.ec/cgi-bin/wxis.exe/iah/scripts/?IsisScript=iah.xis&lang=es&base=MARC&nextAction=extsearch&exprSearch='v998^a'"'/
'</script>'/
'</head>'/
'<body>'/
'</body>'/
'</html>'

El lector debe investigar un poco más a fondo sobre Meta Tags y como aplicarlos para exponer con más detalles mayor información de cada registro, no explicaré a fondo este particular debido a su amplitud y aplicación en el PFT.

La pequeña sección de código marcada en rojo es un Javascript que redirecciona la página a la visualización de ese registro en el catálogo del sistema ABCD, esto es debido a que lo principal es que los buscadores indexen los registros y cuando estos sean encontrados y accedidos por los usuarios, la página redireccione automáticamente al usuario al registro dentro del sistema ABCD mediante su catálogo usando expresión de búsqueda: exprSearch='v998^a'. En mi caso, tengo un identificador único para cada registro dentro del campo 998 y subcampo a indexado dentro de ABCD.

Por otro lado en este código debe cambiarse localhost:9090 por la dirección del servidor, ya que esta es parte de la dirección que será pública en Internet y localhost no funcionaría en el caso práctico.

Conversión del Registro.


$mx = $path_mx."\mx ".$db_path."marc/data/marc from=$contador to=$contador pft=@C:\ABCD\www\bases\marc\pfts\es\conversor.pft -all now 2>&1";
exec($mx, &$outmx);
$nuevoarchivo = fopen($contador.".html", "w+");
$posiciones_array = count($outmx);
$contador_posiciones = 0;
while ($contador_posiciones <= $posiciones_array-1)
{
//Guardo cada salida del array convirtiendo la codificación
$outmx[$contador_posiciones] = mb_convert_encoding($outmx[$contador_posiciones], "UTF-8", "ascii");
fputs($nuevoarchivo,$outmx[$contador_posiciones]);
$contador_posiciones ++;
}

Esta sección de código que ya fue presentada arriba e insertada en conversor.php, toma cada registro procesado por MX y convertido con el PFT para ser manipulado en la codificación de caracteres mediante $outmx[$contador_posiciones] = mb_convert_encoding($outmx[$contador_posiciones], "UTF-8", "ascii"); y para ser guardado en un archivo con extensión .html ya con la información final mediante: $nuevoarchivo = fopen($contador.".html", "w+")

Publicación

Finalmente, tendremos tantos archivos como MFNs de nuestra base, cada uno en formato html y con meta tags de los datos de nuestros registros, de manera que los buscadores puedan encontrarlos al momento de indexar nuestros sitios WEB, cabe recalcar que esta totalidad de registros debe estar almacenada en una carpeta que esté en el htdocs que es la que se publica al Internet. Al final, cuando un buscador presente una de estas páginas como resultado, el usuario será redireccionado al catálogo de ABCD que finalmente presentará el registro legible por un humano.

Las estructuras de los directorios quedaría de la siguiente manera:
  • mfn.xis:
mfn.xis
  • conversor.php
  • mfn.txt
conversor.php - mfn.txt
  • conversor.pft
conversor.pft
Como ejemplo, el código de un registro ya procesado:
Ejemplo de resultado de un registro en HTML con Meta Tags
Consideraciones y conclusiones:
  • Para ejecutar el script, deberíamos escribir la siguiente URL en un navegador: http://localhost:9090/publicacionregistros/conversor.php
  • La redirección funcionará siempre y cuando el registro tenga en un campo un identificador único al cual se pueda apuntar con la expresión de búsqueda, esto permitirá presentar el registro en el catálogo de ABCD.
  • Este ejemplo se ha presentado para estructuras MARC, pero el PFT puede ser adaptado a los campos que se manejen en la base de datos que se desee dentro de ABCD, cada script debe ser editado apuntando a la base deseada.
  • El objetivo es que los buscadores encuentren los registros detrás de una base isis en ABCD.
  • Por favor estimado lector, si encuentra algo erróneo o que se deba corregir en la información puede ayudarnos a mejorarla comunicándonoslo y así ayudar a otras personas que necesiten esta información.

No hay comentarios:

Publicar un comentario