version
ElasticSearch : 7.9
elasticsearch-rest-high-level-client : 7.6
problème
J'ai écrit un projet récemment. J'ai utilisé ES quand j'avais besoin de chercher, mais j'ai rencontré quelques trous lors de l'utilisation de script. Enregistrez ici. Mon script existe déjà dans ES et est appelé par id.
processus
1. Utilisez la méthode getParams (). Put () de Script pour définir les paramètres
Résultat: java.lang.UnsupportedOperationException est levée, car la méthode getParams () de Script obtient un UnmodifiableMap, qui est une Map non modifiable et en lecture seule. L'utilisation de la méthode put lèvera une exception. Par conséquent, transmettez le constructeur Entrez simplement les paramètres.
2. Une erreur Variable ** indéfinie s'est produite lors de l'utilisation
Raison: Ceci est lié à ScriptType. Il existe deux types d'énumération ScriptType: INLINE et STORED. Puisque mon script existe dans ES, je devrais utiliser STORED.
if (this.type == ScriptType.INLINE) {
...
} else {
builder.field("id", this.idOrCode);
}
Le code source montre que lorsque le ScriptType est INLINE, idOrCode est le code, c'est-à-dire le code du script, et lorsque le ScriptType est STORED, il est utilisé comme identifiant de script stocké dans ES, mais j'ai utilisé INLINE dans le constructeur, donc une erreur s'est produite. De plus, en regardant le code, vous pouvez voir que le ScriptType par défaut est INLINE, et dans le bloc de code statique, définissez DEFAULT_SCRIPT_TYPE sur INLINE
DEFAULT_SCRIPT_TYPE = ScriptType.INLINE;
3. Exécutez à nouveau, lancez java.lang.IllegalArgumentException: lang ne peut pas être spécifié pour les scripts stockés
Raison: Dans la langue du constructeur, j'ai mis "indolore"
if (lang != null) {
throw new IllegalArgumentException("lang cannot be specified for stored scripts");
}
Selon le code source, définissez simplement le paramètre lang sur null