Buscador Elasticsearch

El buscador Prontus Elasticsearch es un indexador y buscador de texto completo (full text) intecgrado como solución Prontus, que puede ser utilizado para buscar contenidos dentro de instancias de Prontus.

Publicado: Martes 26 de enero de 2021 por Adriano Varoli Piazza
Última modificación: Jueves 28 de enero de 2021

El buscador Elasticsearch contiene varias partes: un servicio de indexación de contenidos, los scripts Prontus que se comunican con él para configuración, mantenimiento e indexación, y un formulario de búsqueda. El indexador funciona analizando los artículos de una instancia Prontus cada vez que se modifican o borran. Como resultado de ese análisis, el indexador completa una base 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. Este servicio permite almacenar texto indexado con acentos y caracteres especiales, indexar campos con distinta importancia relativa y mucho más.

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 scripts de acceso principal al buscador Prontus Elasticsearch son:

  • cgi-bin/prontus_search_custom.cgi, ejecuta las búsquedas y despliega los resultados al usuario web.
  • cgi-bin/prontus_search_tips_custom.cgi, ejecuta la búsqueda con sugerencias.
  • cgi-cpn/es/prontus_indexar_elasticsearch.pl, ejecuta la regeneración de índices y reindexación de contenido.
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.
  • Compatible con el idioma español. Reconoce acentos (á), tildes (ñ) y cremillas (ü), pero no descarta palabras mal escritas. Si una búsqueda especifica una palabra con acento, le dará mayor relevancia.
  • 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).
  • Es compatible con las Friendly URLs de Prontus.
Indexación

El proceso de indexado es llevado a cabo a bajo nivel cuando creas, guardas o eliminas un artículo. Si corresponde, se modifica el índice relevante.

Es posible también regenerar el índice completo y reindexar todo usando el panel de administración, en la sección Administrar - Mantenimiento - Regenerar Indice ElasticSearch.

Una vez allí debes hacer click en el botón "Ejecutar el Proceso".

El buscador toma los parámetros de configuración del archivo [nombre del prontus]-elasticsearch.cfg ubicado en [nombre del sitio]/cpan/[nombre del prontus]-elasticsea.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_custom.cgi # CGI para realizar búsquedas.
prontus_search_tips_custom.cgi # CGI para búsqueda por sugerencias.
/cgi-cpn/es # Directorio cgi privado de Prontus (puede ser cgi-p10.14, etc)
prontus_indexar_elasticsearch.pl # Programa de regeneración de índices e indexación masiva.
  • Archivo de Configuración

/<directorio prontus>/cpan/<nombre del prontus>-elasticsearch.cfg
  • Indices: los índices de este buscador están dentro de la base de datos interna de ElasticSearch

  • Plantillas
/<directorio prontus>/plantillas/extra/search-custom/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 implementar tantas plantillas como sea necesario.

  • Páginas de resultado

/<directorio prontus>/site/cache/search-custom/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_custom.cgi

Las variables de invocación son las siguientes:

Nombre

Ejemplo

Descripción

search_prontus

prontus_noticias

Nombre del directorio Prontus.

search_idx

prontus3_videos

Indice donde buscar.

search_template

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_custom/pags

search_resxpag

10

Resultados por página, con un máximo correspondiente al parámetro RESPERPAG del archivo 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 MAXPAGS del archivo 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 por fecha de publicación, o REL para relevancia). Si no se especifica, se ordena por relevancia.

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 AND).

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_desde

01/01/05
2021-01-29

Fecha de inicio. Puede entregarse en formato dd/mm/yy o yyyy-mm-dd. Si no se especifica, no se filtra por fecha.

Se aceptan separadores / y -.

search_hasta

01/06/05
2021-01-29

Fecha de término. Puede entregarse en formato dd/mm/yy o yyyy-mm-dd. Si no se especifica, no se filtra por fecha.

Se aceptan separadores / y -.

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]&search_idx=[indice]&search_texto=[texto buscado] , 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_custom.cgi?search_prontus=[nombre del sitio]&search_idx=[indice]&search_template=[ nombre de la plantilla]&search_texto=[texto buscado]

Implementar en el sitio

Ver Cómo implementar un buscador Elasticsearch.

Búsqueda en multivista

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

Está en proceso la implementación de múltiples índices de búsqueda, especialmente para el caso de búsquedas específicas en otros idiomas cuando un sitio está implementado con multivistas para este caso.

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>
Estadísticas

Implementamos una página de estadísticas de las búsquedas realizadas. Se encuentra en Administración - Sistema - Estadísticas de Búsquedas con Elasticsearch y permite ver el registro de las búsquedas efectuadas contra Elasticsearch el último día, semana o mes.