Solr DataImportHandler ScriptTransformer中JS功能受限问题求助
解决Solr DataImportHandler中ScriptTransformer加载he模块的问题
为什么require/readFile不生效
Solr的ScriptTransformer使用的是Java Nashorn JavaScript引擎,并非Node.js环境,因此Node.js专属的require、readFile等API在这个环境里不存在,自然会报错。
解决办法
方法1:用Java API加载he.js脚本
Nashorn允许直接调用Java类,我们可以借助Java的文件读取API加载he.js内容,再通过eval执行:
- 确保你已经把he模块的脚本文件(推荐用浏览器版的he.min.js,避免模块化语法问题)放到Solr core的
conf/lib目录下。 - 在
db-data-config.xml的ScriptTransformer中编写以下代码:
<script><![CDATA[ // 使用Solr资源加载器读取he脚本,兼容性更强 var resourceLoader = solrCore.getResourceLoader(); var heInputStream = resourceLoader.openResource("lib/he.min.js"); var heScript = new java.io.BufferedReader(new java.io.InputStreamReader(heInputStream)).lines().collect(java.util.stream.Collectors.joining("\n")); eval(heScript); function removeSpecialCharacters(row) { var targetField = row.get("your_field_name"); // 替换成你要处理的字段名 if (targetField) { row.put("your_field_name", he.decode(targetField)); } return row; } ]]></script>
方法2:直接用Java工具类解码HTML实体(更简便)
不需要额外引入he模块,利用Solr已依赖的org.apache.commons.text.StringEscapeUtils工具类直接解码:
<script><![CDATA[ function removeSpecialCharacters(row) { var targetField = row.get("your_field_name"); if (targetField) { var decodedContent = org.apache.commons.text.StringEscapeUtils.unescapeHtml4(targetField); row.put("your_field_name", decodedContent); } return row; } ]]></script>
这个方法无需额外下载模块,稳定性更强,优先推荐。
内容的提问来源于stack exchange,提问作者Mister Sir
相关产品推荐
相关产品推荐

