Solr 9 Cloud的 solrconfig.xml中 ScriptUpdateProcessorFactory的使用在创建集合时失败
我在Solr 8.11上运行Script Update Factory时没有遇到任何问题。
迁移到Solr9时,在从ConfigSet创建集合的过程中失败,错误如下:
org.apache.solr.client.solrj.impl.BaseHttpSolrClient$RemoteSolrException: Error from server at http://172.19.0.3:8983/solr/admin/cores: Error CREATEing SolrCore 'collection2026-03-01084209_shard1_replica_n1': Unable to create core [collection2026-03-01084209_shard1_replica_n1] Caused by: No ScriptEngine found by name: JavaScript -- supported names: at org.apache.solr.client.solrj.impl.HttpSolrClientBase.processErrorsAndResponse(HttpSolrClientBase.java:268) at org.apache.solr.client.solrj.impl.Http2SolrClient.processErrorsAndResponse(Http2SolrClient.java:690) at org.apache.solr.client.solrj.impl.Http2SolrClient$1.lambda$onHeaders$0(Http2SolrClient.java:544) at org.apache.solr.common.util.ExecutorUtil$MDCAwareThreadPoolExecutor.lambda$execute$0(ExecutorUtil.java:381) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.base/java.lang.Thread.run(Unknown Source)
使用的Docker镜像:image: solr:9.10.1
solrconfig.xml:
......
<updateRequestProcessorChain name="script">
<processor class="org.apache.solr.scripting.update.ScriptUpdateProcessorFactory">
<str name="script">script1234.js</str>
<str name="engine">JavaScript</str>
<lst name="params">
<str name="config_param">example config parameter</str>
</lst>
</processor>
<processor class="solr.LogUpdateProcessorFactory" />
<processor class="solr.RunUpdateProcessorFactory" />
</updateRequestProcessorChain>
.......
docker compose文件(全部标准):
services:
solr:
image: solr:9.10.1
ports:
- "8983:8983"
networks: [search]
environment:
ZK_HOST: "zoo:2181"
command:
- "-Denable.packages=true"
- "-Dsolr.modules=scripting"
depends_on: [zoo]
zoo:
image: zookeeper:3.9
networks: [search]
environment:
ZOO_4LW_COMMANDS_WHITELIST: "mntr,conf,ruok"
networks:
search:
driver: bridge
我尝试了有无engine标签的各种做法。如果我移除engine标签,就会收到一个错误,提示.js扩展名未知。在所有情况下,错误异常都没有提供关于受支持的扩展名或脚本引擎的详细信息。
我在启动模式下以云模式启动Solr9,并包含 -Dsolr.modules=scripting。
用于复现Solr9 API v1的最小脚本:
#!/bin/bash
echo Starting...
cd ./conf_default/conf
DT=$(date +%F%H%M%S)
echo delete config set
curl -u gis:gis "http://localhost:8983/solr/admin/configs?action=DELETE&name=myConfigSet$DT&omitHeader=true"
echo create congigset - with authentication activated
(zip -r - *) | curl -u user:password -X POST --header "Content-Type:application/octet-stream" --data-binary @- "http://localhost:8983/solr/admin/configs?action=UPLOAD&name=myConfigSet$DT"
echo create collection
curl -u user:password "http://localhost:8983/solr/admin/collections?action=CREATE&name=collection$DT&collection.configName=myConfigSet$DT&numShards=1"
有人知道我在这里到底哪里做错了吗?
解决方案
这很可能是因为Nashorn(JVM的 JavaScript引擎)已从JDK中移除:
Java 11及以前版本自带一个名为 Nashorn 的JavaScript引擎,但 Java 12将需要你自行添加JavaScript引擎。
Nashorn仍作为一个独立的OpenJDK项目维护,因此你仍可以通过将所需的JAR文件添加到Solr的 Lib目录中来使用它。
供参考: