Descripcion general del scripting

Descripcion general

En Fess, puede implementar logica personalizada usando scripts en diversos escenarios. Al aprovechar los scripts, puede controlar de manera flexible el procesamiento de datos durante el crawl, la transformacion de URLs y la ejecucion de trabajos programados.

Lenguajes de scripting compatibles

Fess soporta los siguientes lenguajes de scripting:

Lenguaje Identificador Descripcion
Groovy groovy Lenguaje de scripting registrado de forma predeterminada. Compatible con Java y proporciona funcionalidades potentes

Nota

El unico motor de scripting registrado de forma predeterminada en Fess es Groovy. El lenguaje de scripting por defecto es groovy ( Constants.DEFAULT_SCRIPT ). Todos los ejemplos de scripts de este documento estan escritos en sintaxis Groovy.

Casos de uso del scripting

Configuracion de data store

En los conectores de data store, se usan scripts para mapear los datos obtenidos a los campos del indice. La configuracion se escribe en formato nombre_de_campo=expresion una linea por entrada, y cada linea se evalua como una expresion Groovy independiente.

url=site_url
title=name
content=description
last_modified=updated_at

Los nombres de variables disponibles en los scripts de data store varian segun el tipo de conector. Por ejemplo, en el data store CSV y en el data store JSON, cada nombre de columna o campo puede usarse directamente como variable (sin prefijo comun como data). En los conectores de tipo archivo (Box, Google Drive, OneDrive, etc.) se usa el prefijo file.*, en Slack se usa message.*, y cada conector tiene su propio prefijo. Consulte la documentacion de cada conector de data store para conocer las variables disponibles.

Nota

Cada linea de un data store se evalua como una expresion unica, por lo que no es posible usar bloques if de varias lineas, sentencias import ni declaraciones de variables con def. Para cambiar un valor segun una condicion, use el operador ternario por campo (por ejemplo: title=enabled == "true" ? name : null ). Para referenciar clases, escriba el nombre completamente cualificado (FQCN) en linea.

Mapeo de rutas

El mapeo de rutas es una funcion para normalizar y transformar las URLs a crawlear. De forma predeterminada, se configura mediante un par de «expresion regular» y «cadena de reemplazo», y no es un script Groovy. Por ejemplo, si se especifica http:// como expresion regular y https:// como cadena de reemplazo, se sustituye el esquema de la URL.

Solo cuando la cadena de reemplazo comienza con el prefijo groovy:, la cadena restante se evalua como un script Groovy. Dentro de este script, se puede usar url para la cadena de URL a transformar y matcher para el java.util.regex.Matcher de la expresion regular.

groovy:url.replaceAll("http://", "https://")

Trabajos programados

En los trabajos programados, puede escribir logica de procesamiento personalizada en scripts Groovy. El script completo se evalua como un unico script Groovy, por lo que es posible usar multiples lineas, sentencias import y declaraciones de variables con def.

return container.getComponent("crawlJob").logLevel("info").gcLogging().execute(executor);

Los metodos como logLevel("info") son metodos de la clase del trabajo ( ExecJob y sus subclases) y pueden encadenarse. Consulte «Contexto de ejecucion y objetos disponibles» para obtener informacion sobre la variable executor.

Sintaxis basica

A continuacion se muestran ejemplos de sintaxis basica de Groovy. Los comentarios se escriben con // (comentario de linea) o /* */ (comentario de bloque). Tenga en cuenta que los comentarios que comienzan con # no son validos en Groovy.

Acceso a variables

// Campo del data store (en CSV/JSON, se accede por nombre de columna o campo)
title

// Obtener un componente del contenedor DI
container.getComponent("systemHelper")

Operaciones de cadenas

// Concatenacion
title + " - " + category

// Reemplazo
content.replaceAll("old", "new")

// Division
tags.split(",")

Estructuras condicionales

// Operador ternario
status == "active" ? "Activo" : "Inactivo"

// Valor por defecto cuando es null o vacio (operador Elvis)
description ?: "Sin descripcion"

Operaciones de fecha

// Fecha y hora actual
new Date()

// Formato
new java.text.SimpleDateFormat("yyyy-MM-dd").format(updated_at)

Contexto de ejecucion y objetos disponibles

Los objetos disponibles dentro de un script varian segun el contexto en que se ejecuta. Solo container esta disponible en todos los contextos.

Contexto de ejecucion Objetos disponibles Descripcion
Todos los contextos container

Contenedor DI. Acceso a componentes mediante container.getComponent("systemHelper") o container.getComponent("fessConfig")

Script de data store Variables de campo especificas del conector

Cada campo obtenido del data store esta disponible como variable (los nombres de variable y prefijos varian segun el conector; en CSV/JSON el nombre del campo se usa directamente como variable)

Mapeo de rutas url matcher La cadena de URL a transformar y el Matcher de la expresion regular (solo cuando se usa el prefijo groovy:)
Trabajos programados executor Instancia de ejecucion del trabajo ( JobExecutor ). Se usa para controlar el apagado del trabajo

Nota

Los objetos distintos de container solo se inyectan en contextos especificos. Por ejemplo, executor solo esta disponible en trabajos programados y no puede usarse en scripts de data store ni en mapeo de rutas.

Seguridad

Advertencia

Los scripts tienen funcionalidades muy potentes; uselos unicamente desde fuentes de confianza.

  • Los scripts se ejecutan en el servidor

  • Es posible acceder al sistema de archivos y a la red

  • Asegurese de que solo los usuarios con privilegios de administrador puedan editar scripts

  • La ejecucion de scripts se registra en el log de auditoria ( audit.log ). El registro puede controlarse con script.audit.log.enabled y esta activado por defecto ( true ). La longitud maxima de la cadena de script registrada se controla con script.audit.log.max.length y el valor por defecto es 100 caracteres.

Rendimiento

Consejos para optimizar el rendimiento de los scripts:

  1. Evitar procesamiento complejo: Los scripts de data store se ejecutan por cada documento

  2. Minimizar el acceso a recursos externos: Las llamadas de red son una fuente de latencia

  3. Aprovechar la cache: Considere usar cache para valores que se usan repetidamente

Depuracion

En los scripts de trabajos programados, el script completo se evalua como un unico script Groovy, por lo que puede usar la salida de logs para depurar. (En los scripts de data store, cada linea se evalua como una expresion individual, por lo que no es posible usar sentencias import ni procesamiento en varias lineas.)

import org.apache.logging.log4j.LogManager
def logger = LogManager.getLogger("fess.script")
logger.info("executor = {}", executor)

El ejemplo anterior usa un logger denominado fess.script. Para que este log se emita, agregue la configuracion del logger correspondiente en app/WEB-INF/classes/log4j2.xml.

<Logger name="fess.script" level="DEBUG"/>

Ademas, para activar los logs de depuracion del propio motor de scripting, establezca el nivel de log del paquete org.codelibs.fess.script en DEBUG.

<Logger name="org.codelibs.fess.script" level="DEBUG"/>

Informacion de referencia