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.
Última modificación: Miércoles 10 de agosto de 2022
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_advanced.cgi
, ejecuta las búsquedas y despliega los resultados al usuario web.cgi-bin/prontus_search_tips_advanced.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.
- 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.
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]-elasticsearch.cfg
. Puedes ver la descripción de cada variable de configuración en el artículo correspondiente.
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_advanced.cgi # CGI para realizar búsquedas.
prontus_search_tips_advanced.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_advanced/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_advanced/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.
La búsqueda dentro de los índices previamente creados se realiza mediante la CGI
prontus_search_advanced.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_advanced/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 |
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 |
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_advanced.cgi?search_prontus=[nombre del sitio]&search_idx=[indice]&search_texto=[texto buscado]
, por ejemplo /cgi-bin/prontus_search_advanced.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_advanced.cgi?search_prontus=[nombre del sitio]&search_idx=[indice]&search_template=[ nombre de la plantilla]&search_texto=[texto buscado]
Ver Cómo implementar un buscador Elasticsearch.
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.
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.
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
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.
/[nombre del sitio]/plantillas/extra/mapa/pags/tax_secc.js
var SECC ={
%%loop_seccion%% '%%_seccion1%%':'%%_nom%%',
%%/loop_seccion%% '0': ''
}
/[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':{ }
}
}
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('', '');
}
};
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>
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.
Conceptos Básicos
¿Qué es Prontus?
Estructura de directorios
Glosario
Navegadores soportados
Tutoriales
Instalación de Prontus CMS
Implementar un nuevo sitio en Prontus
Cómo crear un FID
Cómo crear una plantilla de artículo
Cómo crear una plantilla de portada
Cómo crear plantillas de formulario
Cómo implementar un formulario
Cómo implementar un buscador
Cómo implementar un buscador Elasticsearch
Cómo crear una plantilla de taxonomía
Cómo crear plantillas de tags
Cómo crear una plantilla de listado
Cómo crear una plantilla de tags jerárquicos
Implementar carga de videos en Prontus
Integración de Redes Sociales
Instalación y Configuración
Requerimientos
Configuración del servidor
Base de datos
Asegurar la plataforma
Instalación con Wizard Prontus
Ajustes post-instalación
Archivos de configuración de Prontus
Friendly URLs
Friendly URLs para imágenes
SSI en Prontus
Logs de Eventos
Ejecutar procesos periódicamente con cron
Debugging
Plantillas
Plantillas de FID
Plantillas de artículo
Plantillas de portada
Plantillas de taxonomía
Plantillas de artículos relacionados
Plantillas de tags
Plantillas de listado
Plantillas de tags jerárquicos
Plantillas de mapa de taxonomía
Plantillas de mapa de tags
Marcas
Tipos de marcas
Diccionario de marcas
Marcas para texto
Marcas de lógica
Marcas de despliegue
Marca Menú y Panel
Parsing de marcas en formularios Prontus
Funcionalidades
Funcionalidades SEO en Prontus CMS
Multivistas
Galería de Imágenes
Buscador Multivista
Buscador
Buscador Elasticsearch
Calendarios
Imprimir artículos
Posting de contenidos
Plugins
Post-procesos
Prontus functions
Implementar copias de seguridad automáticas con Dropbox
Implementar múltiples ediciones
Regeneración masiva de artículos via línea de comandos