Übersicht
Fess ermöglicht es, in verschiedenen Situationen benutzerdefinierte Logik mithilfe von Skripten zu implementieren. Durch den Einsatz von Skripten lassen sich Datenverarbeitung beim Crawling, URL-Transformationen und die Ausführung geplanter Aufgaben flexibel steuern.
Unterstützte Skriptsprachen
Fess unterstützt die folgenden Skriptsprachen:
| Sprache | Bezeichner | Beschreibung |
|---|---|---|
| JavaScript | javascript (Aliase: js , sai ) | Die standardmäßig in Fess integrierte Skriptsprache und zugleich die Standard-Skriptsprache ( |
| Groovy | groovy | Wird als |
Bemerkung
Eine Skript-Konfiguration ohne hinterlegten Skripttyp wird als Groovy behandelt. Dies ist keine vorübergehende Übergangsmaßnahme, sondern dauerhaftes Verhalten: Eine vor 15.9 erstellte Konfiguration behält ihr Groovy-Skript, ohne dass ein Skripttyp hinterlegt ist — genau dieses Standardverhalten sorgt dafür, dass sie nach einem Upgrade unverändert weiterläuft. Eine ab 15.9 neu erstellte Konfiguration erhält den Skripttyp javascript explizit hinterlegt.
Sofern nicht anders angegeben, sind die Skriptbeispiele in dieser Dokumentation in JavaScript-Syntax verfasst. Für Groovy-Syntax siehe Groovy-Skripting-Leitfaden.
Anwendungsfälle für Skripte
Datenspeicher-Konfiguration
Datenspeicher-Konnektoren verwenden Skripte, um abgerufene Daten auf Indexfelder abzubilden. Die Konfiguration wird im Format Feldname=Ausdruck zeilenweise angegeben; jede Zeile wird als eigenständiger Skript-Ausdruck ausgewertet (standardmäßig JavaScript).
Die im Datenspeicher-Skript verfügbaren Variablennamen hängen vom jeweiligen Konnektor ab. Bei CSV- und JSON-Datenspeichern sind die Spalten- bzw. Feldnamen direkt als Variablen verfügbar (es wird kein gemeinsames Präfix wie data vorangestellt). Bei dateibasierten Konnektoren (Box, Google Drive, OneDrive usw.) lautet das Präfix file.*, bei Slack message.* — das Präfix variiert je nach Konnektor. Details zu den verfügbaren Variablen entnehmen Sie bitte der Dokumentation des jeweiligen Datenspeicher-Konnektors.
Bemerkung
Da jede Zeile eines Datenspeicher-Skripts als einzelner Ausdruck ausgewertet wird, sind mehrzeilige if-Blöcke sowie Variablendeklarationen wie let / const nicht zulässig. Für wertabhängige Felder verwenden Sie den ternären Operator (z. B. title=enabled === "true" ? name : null). Klassen werden über ihren vollständig qualifizierten Namen (FQCN) inline referenziert.
Pfad-Mapping
Pfad-Mapping dient zur Normalisierung und Transformation von Crawling-URLs. Standardmäßig wird es als Paar aus „Regulärem Ausdruck“ und „Ersetzungszeichenkette“ konfiguriert — dies ist kein Skript. Beispielsweise ersetzt der reguläre Ausdruck http:// mit der Ersetzungszeichenkette https:// das URL-Schema.
Beginnt die Ersetzungszeichenkette mit (Engine-Name):, wird der Teil vor dem Doppelpunkt als Name einer Skript-Engine gelesen; stimmt er mit einer registrierten Engine überein, wird der restliche Teil von dieser Engine als Skript ausgewertet. groovy: wählt beispielsweise die Groovy-Engine (erfordert das Plugin fess-script-groovy), javascript: (Aliase js:, sai:) wählt die JavaScript-Engine. Stimmt der Teil vor dem Doppelpunkt mit keiner registrierten Engine überein — etwa https:// in einer gewöhnlichen Ersetzungszeichenkette —, wird die gesamte Zeichenkette nicht als Skript behandelt, sondern unverändert als regulärer Ersetzungsstring verwendet. Wird die Zeichenkette als Skript ausgewertet, stehen darin url (die zu transformierende URL-Zeichenkette) und matcher (der java.util.regex.Matcher des regulären Ausdrucks) zur Verfügung.
Geplante Aufgaben
Bei geplanten Aufgaben kann benutzerdefinierte Verarbeitungslogik als Skript verfasst werden. Das gesamte Skript wird als ein einziges Skript ausgewertet, sodass mehrzeilige Anweisungen möglich sind — bei JavaScript zum Beispiel let / const-Variablendeklarationen und Kontrollstrukturen.
Eine return-Anweisung auf oberster Ebene ist in reinem JavaScript normalerweise ein Syntaxfehler. Die Skript-Engine von Fess versucht zunächst, das Skript als Ausdruck zu kompilieren, und interpretiert es nur dann als Block von Anweisungen, wenn dies fehlschlägt. Dieses Beispiel lässt sich nicht als Ausdruck kompilieren und wird daher als Anweisungsblock ausgeführt. Details siehe JavaScript-Skripting-Leitfaden.
Methoden wie logLevel("info") gehören zur Job-Klasse (ExecJob und deren Unterklassen) und können per Method-Chaining aufgerufen werden. Informationen zur executor-Variablen finden Sie im Abschnitt „Ausführungskontext und verfügbare Objekte“.
Grundlegende Syntax
Im Folgenden finden Sie grundlegende JavaScript-Syntaxbeispiele. Kommentare werden mit // (Zeilenkommentar) oder /* */ (Blockkommentar) angegeben. Beachten Sie, dass Kommentare mit # auch in JavaScript nicht verwendet werden können.
Variablenzugriff
Zeichenkettenoperationen
Bedingte Verzweigung
Datumsoperationen
Ausführungskontext und verfügbare Objekte
Die in einem Skript verfügbaren Objekte hängen vom jeweiligen Ausführungskontext ab. Nur container ist in allen Kontexten verfügbar.
| Ausführungskontext | Verfügbare Objekte | Beschreibung |
|---|---|---|
| Alle Kontexte | container | DI-Container. Zugriff auf einzelne Komponenten über |
| Datenspeicher-Skript | Konnektor-spezifische Feldvariablen | Die vom Datenspeicher abgerufenen Felder stehen als Variablen zur Verfügung (Variablennamen und Präfixe variieren je nach Konnektor; bei CSV/JSON werden Feldnamen direkt als Variablen verwendet) |
| Pfad-Mapping | url matcher | Die zu transformierende URL-Zeichenkette und der |
| Geplante Aufgaben | executor | Job-Ausführungsinstanz (JobExecutor). Wird zur Steuerung des Job-Shutdowns verwendet |
Bemerkung
Andere Objekte als container werden nur in bestimmten Kontexten injiziert. Beispielsweise ist executor ausschließlich in geplanten Aufgaben verfügbar und steht in Datenspeicher-Skripten oder beim Pfad-Mapping nicht zur Verfügung.
Sicherheit
Warnung
Skripte besitzen weitreichende Fähigkeiten — verwenden Sie sie daher ausschließlich aus vertrauenswürdigen Quellen.
Skripte werden auf dem Server ausgeführt
Zugriff auf das Dateisystem und Netzwerk ist möglich
Stellen Sie sicher, dass nur Benutzer mit Administratorrechten Skripte bearbeiten können
Die Skriptausführung wird im Audit-Log (
audit.log) protokolliert. Die Protokollierung wird überscript.audit.log.enabledgesteuert; der Standardwert isttrue. Die maximale Länge der protokollierten Skriptzeichenkette wird überscript.audit.log.max.lengthgesteuert; der Standardwert beträgt100Zeichen.
Leistung
Hinweise zur Optimierung der Skript-Leistung:
Komplexe Verarbeitung vermeiden: Datenspeicher-Skripte werden für jedes Dokument ausgeführt
Zugriff auf externe Ressourcen minimieren: Netzwerkaufrufe verursachen Verzögerungen
Caching nutzen: Erwägen Sie das Zwischenspeichern von wiederholt verwendeten Werten
Debugging
Da Skripte für geplante Aufgaben als ein einziges Skript ausgewertet werden, können Protokollausgaben zum Debugging eingesetzt werden. (Datenspeicher-Skripte werden zeilenweise als einzelne Ausdrücke ausgewertet, daher ist dort keine mehrzeilige Verarbeitung möglich.)
Das obige Beispiel verwendet einen Logger mit dem Namen fess.script. Um diese Protokollausgabe zu aktivieren, fügen Sie die entsprechende Logger-Konfiguration in app/WEB-INF/classes/log4j2.xml ein.
Um Debug-Protokolle der Skript-Engine selbst zu aktivieren, setzen Sie den Protokolllevel des Pakets org.codelibs.fess.script auf DEBUG.
Referenzinformationen
JavaScript-Skripting-Leitfaden - JavaScript-Skripting-Leitfaden
Groovy-Skripting-Leitfaden - Groovy-Skripting-Leitfaden (Plugin)
Datenspeicher-Crawl - Datenspeicher-Konfigurationsleitfaden
Scheduler - Scheduler-Konfigurationsleitfaden