Buscador

El buscador Prontus es un indexador y buscador de texto completo (full text) integrado a Prontus, que puede ser utilizado para buscar contenidos dentro de instancias de Prontus, dentro de páginas web de formato libre e incluso dentro de archivos de tipo binario como PDFs o documentos de texto.

Publicado: Martes 25 de septiembre de 2018 por David García
Última modificación: Jueves 26 de agosto de 2021

El buscador Prontus consiste en dos soluciones: un indexador de contenidos que genera archivos estáticos, y un formulario de búsqueda. El indexador funciona analizando los artículos de una instancia Prontus o archivos sueltos dentro de un conjunto de directorios en el disco duro del servidor virtual. Como resultado de ese análisis, el indexador construye archivos de bases de datos que contienen todas las palabras relevantes encontradas dentro de los textos, organizadas de forma tal que la búsqueda de palabras e identificación de los archivos que las contienen es rápida y eficiente.

Dentro de estas bases de datos, denominadas "índices", se almacena toda la información que será desplegada como resultado de una búsqueda, de manera que no es necesario volver a leer los archivos indexados para entregar información básica acerca de ellos (su ubicación -url-, el titular y las primeras palabras del texto).

Al hacer una búsqueda, puedes implementar una serie de filtros para acotar la búsqueda de manera más específica según tus necesidades. Estos filtros incluyen criterios como búsqueda por taxonomía, por fecha y orden de los resultados.

Los programas que forman el buscador Prontus son dos:

  • prontus_indexer.cgi, recorre los directorios y sitios externos indexando archivos.
  • prontus_search.cgi, ejecuta las búsquedas y despliega los resultados al usuario web.

Imagen foto_00000002

Prestaciones
  • Utiliza la estructura de datos de Prontus para reconocer el texto significativo que debe ser indexado, haciendo más eficiente este proceso y descartando texto superfluo, no significativo o confuso.
  • Utiliza la estructura de datos de Prontus para reconocer el alta y la fecha y hora de publicación y expiración de cada artículo, decidiendo de acuerdo a esto si los indexa o no.
  • Permite definir el límite de repeticiones máximo para reconocer y descartar palabras no significativas.
  • Al indexar directorios arbitrarios, permite definir los tipos de archivo que serán indexados.
  • Compatible con el idioma español. Reconoce acentos (á), tildes (ñ) y cremillas (ü).
  • Permite buscar dentro de un índice en particular o en todos los índices almacenados.
  • Busca por una o más palabras, entregando resultados que las contienen todas (modalidad AND) o alguna de ellas (modalidad OR).
  • Permite buscar por frases (texto entre comillas).
  • Permite definir palabras a eliminar de los resultados (modalidad NOT).
  • Reconoce comodines '*' (varias letras) y '?' (una letra).
  • Entrega resultados ordenados por importancia (cantidad de palabras encontradas dentro del texto) o por fecha de publicación.
  • Permite filtrar por taxonomía Prontus (sección, tema y subtema de los artículos).
  • Permite filtrar por rango de fechas.
  • Permite implementar distintos formularios de búsqueda y plantillas para mostrar los resultados.
  • Entrega los resultados paginados, pudiendo definirse la cantidad máxima de páginas y la cantidad de resultados a mostrar en cada una.
  • Los resultados son escritos y entregados desde un directorio temporal, de manera de incluir con naturalidad los elementos dinámicos que rodeen la página de respuesta (por ejemplo, PHP o ASP).
  • Permite la integración de filtros externos para indexar archivos de datos tales como PDF, DOC, etc.
  • Permite definir un archivo de bitácora para registrar la fecha, hora, número IP y texto buscado en cada oportunidad.
  • Es compatible con las Friendly URLs de Prontus.
Indexación

El proceso de indexado es llevado a cabo por el programa prontus_indexer.cgi, que puedes invocar mediante una interfaz de línea de comando, manualmente o usando cron, o a través de un navegador usando el panel de administración del sitio:

Una vez allí debes hacer click en el botón "Reindexar Todo"

El buscador toma los parámetros de configuración del archivo buscador_prontus.cfg ubicado en [nombre del sitio]/cpan/buscador_prontus.cfg. Puedes ver la descripción de cada variable de configuración en el artículo correspondiente.

Directorios

Los directorios donde se alojan las componentes del buscador Prontus son los siguientes:

  • Programas

/cgi-bin # Directorio cgi público de Prontus (puede ser cgi-b10.14, etc)

prontus_search.cgi # CGI para realizar búsquedas.

/cgi-cpn # Directorio cgi privado de Prontus (puede ser cgi-p10.14, etc)

prontus_indexer.cgi # Programa de indexación.

lib_search.pm # Biblioteca de rutinas del Buscador Prontus

# (debe incluirse si el código no es compilado).
  • Archivo de Configuración

/<directorio prontus>/cpan/buscador_prontus.cfg
  • Indices

/<directorio prontus>/cpan/data/search

raw/0000 # Indice de archivos arbitrarios.

url/0000 # Indice de archivos obtenidos vía spider.

<dir prontus>/aaaa # Indice del año aaaa del prontus <dir prontus>.

...

Se crea un nuevo índice cada año para evitar que éste crezca en forma descontrolada. Para sitios con mucho contenido (20.000 artículos al año) indexar un año completo puede requerir hasta 100 MB disponibles en RAM.

  • Archivo Semáforo

/<directorio prontus>/cpan/data/search

semaforo.txt # Archivo semáforo.

El semáforo impide la ejecución de más de una copia del indexador para una misma instancia de Prontus; sin embargo, si el archivo es más antiguo que 12 horas, entonces es descartado. Así se impide un deadlock en caso de que la ejecución del indexador sea abortada por alguna razón y no se alcance a borrar el archivo semáforo.

  • Plantillas

/<directorio prontus>/plantillas/extra/search/pags

search.html # Plantilla por defecto.

<nombre>.html # Otra plantilla.

...

La plantilla a utilizar se especifica dentro de los parámetros de invocación del buscador. Puedes usar tantas plantillas como sea necesario.

  • Páginas de resultado

/<directorio prontus>/site/cache/search/pags

search.html # Plantilla por defecto.

<nombre>.html # Otra plantilla.

La página de resultado se escriben en este directorio y el browser del usuario se dirige para leerla desde ahí mediante una redirección HTTP. Los nombres de estos archivos tienen la forma:

'search' . <tiempo Unix (segundos)> . <número de proceso> . <extension>

La extensión es la misma que la de la plantilla.
Cada vez que se hace una búsqueda, se borran de este directorio los archivos con más de 5 minutos de antigüedad.

Funcionamiento del buscador

La búsqueda dentro de los índices previamente creados se realiza mediante la CGI

prontus_search.cgi

Las variables de invocación son las siguientes:

Nombre

Ejemplo

Descripción

search_prontus

prontus_noticias

Nombre del directorio Prontus donde residen los índices.

search_comodines

yes

'yes' o 'no'. Si es 'yes', permite la búsqueda usando los comodines * y ?.

La búsqueda con comodines utiliza muchos más recursos que la búsqueda sin ellos, por lo que esta modalidad no es recomendable para sitios expuestos a muchas visitas. Valor por defecto: 'no'.

search_idx

prontus3_videos

Indice donde buscar. Puede ser 'ALL', en cuyo caso se busca en todos. Si no se especifica, busca en el índice correspondiente a search_prontus.

search_tmp

search_simple.HTML

Nombre de la plantilla de búsqueda. Si no se especifica, se usa search.HTML

Las plantillas se toman de

/< search_prontus >/plantillas/extra/search/pags

search_resxpag

10

Resultados por página, con un máximo correspondiente al parámetro RESPERPAGarchivo de configuración.

Si la variable search_resxpag no se especifica, se asume el valor del parámetro RESPERPAG archivo de configuración.

Si el parámetro RESPERPAG no existe en el archivo de configuración, se usa el valor 50.

search_maxpags

20

Resultados por página, con un máximo correspondiente al parámetro MAXPAGSarchivo de configuración.

Si la variable search_maxpags no se especifica, se asume el valor del parámetro MAXPAGS archivo de configuración.

Si el parámetro MAXPAGS no existe en el archivo de configuración, se usa el valor 20.

search_texto

flores -fernando

Texto a buscar. Este texto es validado y convertido en un conjunto de palabras. Si están habilitados (search_comodines = yes), pueden usarse los comodines * y ?.

Un signo menos (-) ante una palabra excluirá los resultados que la contengan.

Puede buscarse por todas las palabras o por sólo algunas de ellas, dependiendo de la variable search_modo.

search_pag

5

Página a mostrar. Si no se especifica, se muestra la primera página.

search_orden

CRO

Orden de los resultados (CRO para cronológico o REL para relevancia). Si no se especifica, se ordena cronológico.

search_form

yes

Mostrar formulario ('yes' o 'no'). Valor por defecto: 'yes'.

search_modo

AND

Hacer AND u OR con las palabras ingresadas (por defecto hace OR).

search_seccion

Noticias

Nombre de la sección a mostrar. Si no se especifica, se muestran todas.

search_tema

Santiago

Nombre del tema a mostrar. Si no se especifica, se muestran todos.

search_subtema

Salud

Nombre del subtema a mostrar. Si no se especifica, se muestran todos.

search_fechaini

01/01/05
1-4-2009

Fecha de inicio. Si no se especifica, no se filtra por fecha.

Se aceptan separadores / y -.

search_fechafin

01/06/05
13-7-2008

Fecha de término. Si no se especifica, no se filtra por fecha.

Se aceptan separadores / y -.

search_meta1

imagen

Variable META1, definida en el archivo de configuración.
(Muestra sólo resultados cuya variable META1 corresponde al valor pasado en la invocación)

search_meta2

calle

Variable META2, definida en el archivo de configuración.

(Muestra sólo resultados cuya variable META2 corresponde al valor pasado en la invocación)

search_meta3

zoo

Variable META3, definida en el archivo de configuración.

(Muestra sólo resultados cuya variable META2 corresponde al valor pasado en la invocación)

Aplicación

Puedes usar el buscador Prontus con un mínimo de variables de invocación, con todas ellas o con un conjunto escogido de acuerdo a las características del sitio web. El resto puede no especificarse para utilizar los valores por defecto u ocultarse de la vista del usuario haciendo uso de variables ocultas (campos hidden).

Además, puedes usar el buscador Prontus con o sin formulario incluido en los resultados, lo cual te otorga una gran libertad a la hora de diagramar la mecánica de funcionamiento.

  • Invocación mínima

En caso de poseer el formulario inserto dentro de la plantilla de resultados, basta con invocar /cgi-bin/prontus_search.cgi?search_prontus=[nombre del sitio] , por ejemplo /cgi-bin/prontus_search.cgi?search_prontus=prontus_noticias para que se despliegue la plantilla por defecto mostrando sólo el formulario de búsqueda.

  • Invocación mínima con cambio de plantilla

Si necesitas especificar otra plantilla a mostrar, entonces la invocación cambia a /cgi-bin/prontus_search.cgi?search_prontus=[nombre del sitio]?search_tmp=[ nombre de la plantilla ]

Implementar en el sitio

Ver Cómo implementar un buscador.

Búsqueda en multivista

Puedes también especificar dinámicamente la plantilla de resultados usando la variable de invocación search_tmp en tus formularios. Eso en este caso te permitirá configurar la plantilla a una adecuada a cada multivista distinta.

Para la aplicación en sitios con múltiples idiomas, deberás implementar instancias de Prontus separadas con el objeto de contener los indexadores de cada idioma. Por ejemplo, si un sitio tienen versiones en inglés y español, se instala una instancia de Prontus aparte, llamada por ejemplo prontus_search, y se configura para que su buscador indexe el sitio original, llamado por ejemplo prontus_empresa, mediante la variable en el archivo de configuración: 

PRONTUS_DIR_1 = /prontus_empresa

En el mismo archivo de configuración se especifica que el buscador indexe sólo los textos en inglés, por ejemplo:

# Variable Prontus que sera considerada el titular.
TITLEVAR = txt_titular_en# Variables Prontus sobre las que se buscara.
TEXTVARS = txt_titular_en txt_bajada_en vtxt_cuerpo_en vtxt_recuadro_en txt_asociado1_entxt_asociado2_en txt_asociado3_en

En este ejemplo mostramos marcas Prontus con el sufijo _en para contener los textos en inglés.

Búsqueda Avanzada

Puedes implementar una serie de filtros para acotar la búsqueda de manera más específica, según requiera el usuario. Éstos incluyen criterios como búsqueda por taxonomía, por fecha y orden de los resultados.

Requisitos

El buscador incluye una serie de filtros que se manejan mediante javascript, por lo que se deben incluir en el header de las plantillas que utilizen al buscador avanzado.

/[nombre del sitio]/js-local/jquery/jquery.js
/[nombre del sitio]/js-local/jquery/jquery-ui.js
Filtro por taxonomía

Para esta implementación, necesitas las que definen, y generan, los objetos con los listados correspondientes a las categorías Prontus (Sección, Tema y Subtema) existentes en el sitio.

Sección
/[nombre del sitio]/plantillas/extra/mapa/pags/tax_secc.js
var SECC ={
  %%loop_seccion%% '%%_seccion1%%':'%%_nom%%',
  %%/loop_seccion%% '0': ''
}
Tema
/[nombre del sitio]/plantillas/extra/mapa/pags/tax_tem.js
var TEMA ={
  '0':{%%loop_seccion%% '0':''},
  '%%_seccion1%%':{
      %%/loop_seccion%%
  %%loop_tema%% '%%_tema1%%': '%%_nom%%',
  %%/loop_tema%%
  '0':{  }
  }
}
/[nombre del sitio]/plantillas/extra/mapa/pags/tax_subtem.js
var SUBTEMA ={
    '0':{%%loop_seccion%%%%/loop_seccion%%%%loop_tema%% '0':''}, 
'%%_tema1%%':{
    %%/loop_tema%%
%%loop_subtema%% '%%_subtema1%%': '%%_nom%%',
%%/loop_subtema%% '0':{ }
  }
} 
Clase controladora de formulario

Además de los listados se necesita una clase que controle los eventos en el formulario. Para esto, puedes implementar un script como el siguiente, que llamaremos >/[nombre del sitio]/js-local/Taxonomia.class.js:


var Taxonomia = {
    load_seccion: function() {
        Taxonomia.limpiaTaxonomia('SECCION1');
        Taxonomia.limpiaTaxonomia('TEMA1');
        Taxonomia.limpiaTaxonomia('SUBTEMA1');
        var objcombo = document.getElementById('SECCION1');
        var j=0;
        objcombo.options[j++] = new Option('---', '');
        for (var i in SECC){
            if (i != 0 && SECC[i] != null && SECC[i] != undefined) {
                objcombo.options[j++] = new Option(SECC[i], i);
            };
        }
        return false;
    },
    load_tema: function() {
        Taxonomia.limpiaTaxonomia('TEMA1');
        Taxonomia.limpiaTaxonomia('SUBTEMA1');
        var seccion = document.getElementById('SECCION1').value;
        var objcombo = document.getElementById('TEMA1');
        var j=0;
        objcombo.options[j++] = new Option('---', '');
        for (var i in TEMA[seccion]){
            if (i != 0 && TEMA[seccion][i] != null && TEMA[seccion][i] != undefined) {
                objcombo.options[j++] = new Option(TEMA[seccion][i], i);
            };
        }
        return false;
    },
    load_subtema: function() {
        Taxonomia.limpiaTaxonomia('SUBTEMA1');
        var tema = document.getElementById('TEMA1').value;
        var objcombo = document.getElementById('SUBTEMA1');
        var j=0;
        objcombo.options[j++] = new Option('---', '');
        for (var i in SUBTEMA[tema]){
            if (i != 0 && SUBTEMA[tema][i] != null && SUBTEMA[tema][i] != undefined) {
                objcombo.options[j++] = new Option(SUBTEMA[tema][i], i);
            };
        }
        return false;
    },
    rellena_nombres_tax: function() {
        if(document.getElementById('SECCION1') && document.getElementById('NOM_SECCION1')) {
            var item = document.getElementById('SECCION1');
            var valor = item.options[item.selectedIndex].text;
            document.getElementById('NOM_SECCION1').value = (valor == '---')? '':valor;
        };
        if(document.getElementById('TEMA1') && document.getElementById('NOM_TEMA1')) {
            var item = document.getElementById('TEMA1');
            var valor = item.options[item.selectedIndex].text;
            document.getElementById('NOM_TEMA1').value = (valor == '---')? '':valor;
        };
        if(document.getElementById('SUBTEMA1') && document.getElementById('NOM_SUBTEMA1')) {
            var item = document.getElementById('SUBTEMA1');
            var valor = item.options[item.selectedIndex].text;
            document.getElementById('NOM_SUBTEMA1').value = (valor == '---')? '':valor;
        };
    },
    init: function() {
        Taxonomia.load_seccion();
        var valor = document.getElementById('NOM_SECCION1').value;
        if (valor != '') {
            Taxonomia._selecciona_default('SECCION1',valor);
            Taxonomia.load_tema();
            valor = document.getElementById('NOM_TEMA1').value;
            if (valor != '') {
                Taxonomia._selecciona_default('TEMA1',valor);
                Taxonomia.load_subtema();
                valor = document.getElementById('NOM_SUBTEMA1').value;
                if (valor != '') {
                    Taxonomia._selecciona_default('SUBTEMA1',valor);
                }
            }
        }
    },
    _selecciona_default: function(id, valor) {
        var opts = document.getElementById(id).options;
        for(var i = 0; i < opts.length; i++) {
            if(opts[i].innerText == valor) {
                opts.selectedIndex = i;
                return;
            }
        }
    },
    limpiaTaxonomia: function(combo) {
        var objcombo = document.getElementById(combo);
        var len = objcombo.options.length;
        for(var i = (len-1); i >= 0 ; i--) {
            objcombo.options[i] = null;
        };
        objcombo.options[0] = new Option('', '');
    }
};
Filtro por fecha de calendario

Para el filtro por fecha se utiliza el plugin datepicker, éste permite seleccionar con el mouse una fecha directamente desde un calendario.

/[nombre del sitio]/js-local/jquery/plugins/datepicker/js/i18n/jquery.ui.datepicker-es.js

Para iniciar el plugin del calendario se debe agregar el siguiente código:


<script type="text/javascript">
  $(document).ready(function(){
      $('.fecha').datepicker({
          dateFormat: 'dd/mm/yy',
          buttonImage: '/#prontus_id#/js-local/jquery/plugins/datepicker/imag/calendar.gif',
          buttonImageOnly: true,
          showOn: 'both'
      });
      Taxonomia.init();
  });
</script>

Artículos Relacionados