Solr URP链调用JS脚本抛出NoSuchMethodException异常
问题根因
抛出No such function finish异常的核心原因是Solr的StatelessScriptUpdateProcessor对关联脚本有强制接口规范,必须实现三个固定生命周期函数,你当前的脚本仅实现了processAdd方法,缺少必需的finish回调函数,因此执行时触发方法不存在的错误。
另外你配置的更新请求处理器链顺序存在问题,会导致日志记录逻辑无法正常生效。
修复方案
1. 补全脚本必需的生命周期函数
Solr无状态脚本更新处理器要求脚本必须实现以下三个函数,无对应业务逻辑时写空实现即可:
processAdd(cmd):处理文档新增/更新请求,即你已经编写的字段解析逻辑processDelete(cmd):处理文档删除请求finish():整批更新请求处理完成后的收尾回调
修正后的完整updateProcessor.js内容如下:
function processAdd(cmd) { var doc = cmd.solrDoc; var field = doc.getFieldValue("id"); // 增加判空逻辑,避免id格式不符合预期时抛出下标越界错误 if (field && field.split("/").length >= 4) { var desired_val = field.split("/")[3]; doc.setField("split", desired_val); } } // 无删除处理需求时留空即可 function processDelete(cmd) { } // 无收尾逻辑需求时留空即可 function finish() { }
注意:脚本内变量建议添加
var声明,避免污染脚本引擎全局上下文引发不可预期的问题。
2. 修正更新处理器链的执行顺序
Solr更新处理器链按照配置从上到下的顺序执行,其中RunUpdateProcessorFactory是真正执行索引写入操作的处理器,必须放在链的最后一位,你当前的配置把LogUpdateProcessorFactory放在它后面,会导致日志逻辑无法正常执行。
修正后的URP链配置如下:
<updateRequestProcessorChain name="update_chain" default="true"> <processor class="solr.StatelessScriptUpdateProcessorFactory"> <str name="script">updateProcessor.js</str> </processor> <processor class="solr.LogUpdateProcessorFactory"/> <processor class="solr.RunUpdateProcessorFactory"/> </updateRequestProcessorChain>
3. 重载配置生效
修改完成后,重载对应Solr核心/集合,重新执行索引操作即可正常运行。
内容的提问来源于stack exchange,提问作者feder
相关产品推荐
相关产品推荐

