Aperçu
JavaScript est le langage de script par défaut de Fess à partir de la version 15.9. Il s’exécute sur Sai (un fork de Nashorn développé par CodeLibs, déjà utilisé par Fess pour les expressions de ses XML de DI), et les scripts sont exécutés en tant qu’ECMAScript 6. Son identifiant est javascript ; il peut également être indiqué via les alias js et sai.
Syntaxe de base
Une ligne sans point-virgule final est ci-dessous une expression et peut être utilisée partout, y compris dans une ligne champ=expression d’un data store. Les déclarations ( let / const ), les blocs if et les boucles sont des instructions : elles ne peuvent être utilisées que là où l’ensemble du script est évalué, comme dans une tâche planifiée, et le script doit contenir un return explicite pour produire une valeur. Voir « Comment les scripts sont évalués » ci-dessus.
Déclaration de variables
Manipulation de chaînes
Opérations sur les collections
Conditions
Boucles
Scripts de Data Store
Exemples de scripts pour la configuration Data Store.
Note
Dans les scripts de data store, chaque ligne champ=expression est évaluée indépendamment en tant qu’expression unique. Par conséquent, les déclarations de variables telles que let / const et les structures de contrôle multi-lignes qui définissent plusieurs champs à la fois (comme les blocs if) ne peuvent pas être utilisées. Lorsque vous utilisez des classes Java, écrivez-les en tant qu’expression unique avec le nom de classe complet (FQCN), et utilisez un opérateur ternaire par champ pour les valeurs conditionnelles (par exemple, url=data.published ? data.url : null ). Par ailleurs, le nom de variable data utilisé ici n’est qu’un exemple ; le nom de variable réel dépend du connecteur de data store utilisé. Consultez Crawl de magasin de données pour plus de détails. Écrivez l’expression sans point-virgule final : une ligne qui ne peut être analysée qu’en tant que bloc d’instructions est évaluée à null et le champ reste non défini — voir Comment les scripts sont évalués.
Mapping de base
Génération d’URL
Traitement du contenu
Traitement des dates
Objets disponibles
Les objets disponibles dans les scripts varient en fonction du contexte d’exécution.
| Contexte | Objet | Description |
|---|---|---|
| Tous les contextes | container | Conteneur DI. Utilisé pour accéder aux composants via container.getComponent("...") |
| Tâches planifiées | executor | Contrôle d’exécution des jobs ( JobExecutor ). Nécessaire pour le support de l’arrêt des jobs |
| Data Store | (spécifique au connecteur) | Variables d’enregistrement de données fournies par chaque data store. Le nom de la variable dépend du connecteur |
| Mappage de chemins | url , matcher | La chaîne URL à convertir et le résultat de la correspondance par expression régulière ( Matcher ). Disponible lorsque le remplacement porte le préfixe du nom d’un moteur enregistré, par exemple javascript: (alias js:, sai:) |
| Boost de document | (champs du document) | Chaque champ du document cible est disponible en tant que variable (utilisé dans les expressions de condition et de valeur de boost) |
Scripts de tâches planifiées
Exemples de scripts JavaScript pour les tâches planifiées. Dans les tâches planifiées, container et executor sont disponibles. Passer executor à la méthode execute() du job active le contrôle d’arrêt du job.
Note
Un script de tâche planifiée est évalué comme un script complet unique. Le moteur de script essaie d’abord de le compiler en tant qu’expression, et ne le réinterprète comme un bloc d’instructions qu’en cas d’échec ; vous pouvez donc utiliser des instructions multi-lignes, des déclarations let / const, des structures de contrôle et une instruction return de niveau supérieur (voir « Comment les scripts sont évalués » ci-dessus). Les exemples ci-dessous « Utilisation des classes Java », « Accès aux composants Fess », « Gestion des erreurs » et « Débogage et journalisation » supposent également ce contexte de script complet.
Exécution d’un job de crawl
Crawl conditionnel
Exécution séquentielle de plusieurs jobs
Utilisation des classes Java
Dans les scripts JavaScript, l’interopérabilité Java de Sai (Nashorn) vous permet d’utiliser directement les bibliothèques standard Java et les classes Fess. JavaScript n’a pas d’instruction import : les classes s’écrivent donc toujours avec leur nom complet (FQCN).
Date et heure
Opérations sur les fichiers
Communication HTTP
Avertissement
L’accès aux ressources externes affecte les performances, utilisez-le au minimum nécessaire.
Accès aux composants Fess
Utilisez container pour accéder aux composants Fess.
System Helper
Récupération des valeurs de configuration
Exécution de recherche
Gestion des erreurs
JavaScript n’a pas d’instruction import ; les contraintes de placement propres à Groovy ne s’appliquent donc pas ici. Vous pouvez intercepter les exceptions avec try-catch pour contrôler les erreurs de job.
Débogage et journalisation
Sortie de logs
Sortie de débogage
Pour inspecter rapidement le contenu d’une variable, convertissez-la en chaîne avec JSON.stringify et journalisez le résultat.
Migration depuis Groovy
Gardez à l’esprit les différences suivantes lorsque vous portez un script Groovy existant vers JavaScript.
Précision arithmétique
Les opérations numériques de JavaScript utilisent toujours des nombres à virgule flottante en double précision. Par exemple, l’expression suivante retourne l’entier 34 en Groovy, mais le nombre à virgule flottante 34.0 en JavaScript.
En revanche, le type de retour d’une méthode appelée via l’interopérabilité Java conserve le type du côté Java, si bien que content.length() continue de retourner un entier.
Réécriture de la syntaxe propre à Groovy
La syntaxe suivante, propre à Groovy, doit être réécrite pour JavaScript.
| Groovy | JavaScript | Description |
|---|---|---|
1000L | 1000 | Le suffixe L des littéraux long n’est pas nécessaire ; écrivez le nombre tel quel |
["a", "b"] as String[] | ["a", "b"] | Un tableau JavaScript est automatiquement converti en tableau Java lorsqu’il est passé à une méthode attendant |
Interopérabilité Java
La notation de l’interopérabilité Java est la même que celle de Nashorn, et diffère peu de celle de Groovy. Les appels de constructeurs entièrement qualifiés tels que new java.io.File(...), java.lang.System.getProperty(...) et new org.codelibs.fess.job.IndexExportJob() se résolvent tels quels.
Syntaxe ES6
Le moteur JavaScript de Fess s’exécutant en tant qu’ECMAScript 6, vous pouvez utiliser la syntaxe ES6 telle que let / const, les fonctions fléchées, les littéraux de gabarit, la déstructuration, for...of et class. En revanche, le chaînage optionnel (?.) et l’opérateur de coalescence des nuls (??) sont des syntaxes ES2020 et ultérieures, et ne peuvent pas être utilisés.
Bonnes pratiques
Garder la simplicité : Éviter les logiques complexes, privilégier un code lisible
Valeurs par défaut : Utiliser l’opérateur OR logique (
||) à la place de l’opérateur ElvisGestion des exceptions : Gérer les erreurs inattendues avec try-catch approprié
Sortie de logs : Afficher des logs pour faciliter le débogage
Performance : Minimiser les accès aux ressources externes
Opérations numériques : Là où un entier est attendu, utilisez directement le résultat d’un appel de méthode via l’interopérabilité Java, ou convertissez explicitement si nécessaire
Informations de référence
Apercu du scripting - Aperçu du scripting
Guide de script Groovy - Guide du scripting Groovy (plugin)
Crawl de magasin de données - Guide de configuration Data Store
Planificateur de tâches - Guide de configuration du planificateur
Comment les scripts sont évalués
Le moteur de script de Fess essaie d’abord de compiler le texte du script en tant qu”« expression » unique. Ce n’est que si cela échoue à l’analyse qu’il recompile le texte en tant que bloc d”« instructions ».
C’est pourquoi une expression simple qui se contente de retourner une valeur :
ainsi qu’un script contenant une instruction
returnde niveau supérieur :fonctionnent tous les deux sans problème. Le second exemple constitue normalement une erreur de syntaxe en JavaScript pur, car un
returnde niveau supérieur n’est pas autorisé. Mais comme il ne peut pas être compilé en tant qu’expression, il est réinterprété comme un bloc d’instructions et s’exécute comme un script valide.Aux endroits où chaque ligne est traitée comme une expression unique, comme dans les scripts Data Store, un script compose de plusieurs instructions ne peut pas être utilisé. Aux endroits où l’ensemble du script est évalué, comme dans les tâches planifiées, vous pouvez librement utiliser des instructions multi-lignes, des déclarations de variables
let/constet des structures de contrôle.Avertissement
Un script compilé en tant que bloc d’instructions ne renvoie une valeur que s’il contient un
returnexplicite. Lorsque le texte ne peut pas être analysé en tant qu’expression, il est enveloppé dans une fonction et exécuté comme un bloc d’instructions, et un bloc sansreturnest évalué ànull. Un simple point-virgule final suffit à franchir cette limite :content.length()11content.length();nullreturnvar x = 1; x + 2nullreturnEn Groovy, les trois renvoyaient une valeur, car la valeur de la dernière instruction évaluée y est la valeur de retour du script. JavaScript n’a pas cette règle.
C’est la seule différence de la migration qui ne produit ni erreur, ni ligne de journal, ni symptôme autre qu’un champ qui se vide silencieusement : un mapping de data store dont le script renvoie
nullne définit tout simplement pas ce champ. Écrivez chaque lignechamp=expressiond’un data store comme une expression pure sans point-virgule final, et donnez à chaque script de tâche planifiée unreturnexplicite.