Solr配置:模块系统详解与安装配置指南 Solr模块是不属于solr-core但由Solr项目官方维护的附加Solr插件。它们提供明确定义的功能,例如”extracting”模块,允许用户使用Apache Tika索引富文本文档。单个模块可以包含多个插件。
⚠️ 历史说明 :模块以前被称为”contribs”(贡献包)。
模块系统架构 模块结构
每个模块在构建时产生一个单独的.jar
文件
打包在模块的lib/
目录中
模块所需的所有额外依赖项(且不由Solr核心提供)也打包在那里
这有助于保持Solr主核心的小而精简
发行版本差异 Solr模块不包含在Solr二进制发行版的slim
变体中。请下载/安装完整的Solr二进制发行版以便使用Solr模块。
安装模块 方法一:系统属性或环境变量 启用模块的最简单方法是列出你打算使用的模块:
使用系统属性 1 2 -Dsolr.modules=extracting,ltr
使用环境变量 1 2 3 4 5 SOLR_MODULES=extracting,ltr set SOLR_MODULES=extracting,ltr
在solr.xml中配置 1 2 3 4 <solr > <str name ="modules" > extracting,ltr</str > </solr >
方法二:Solr CLI启动时指定 1 bin/solr start -e techproducts -Dsolr.modules=scripting
方法三:集合级别配置 如果你只希望为某些集合启用模块,可以在相应配置集的solrconfig.xml
中添加<lib>
标签:
1 2 3 4 5 6 <config > <lib dir ="../../../modules/extracting/lib/" /> <lib dir ="../../../modules/langid/lib/" /> </config >
⚠️ 重要提醒 :
集合级插件在模块启用时工作(无论是每个集合的<lib>
还是整个Solr节点)
节点级插件(如在solr.xml
中指定的插件)在使用solrconfig.xml
中的<lib>
选项时不起作用,因为配置集配置的是集合,而不是节点
它们必须为整个Solr节点启用
常用模块介绍 用于提取和索引富文本文档(PDF、Word、Excel等)。
1 2 SOLR_MODULES=extracting
在solrconfig.xml中配置:
1 2 3 4 5 6 7 8 9 <requestHandler name ="/update/extract" class ="solr.extraction.ExtractingRequestHandler" > <lst name ="defaults" > <str name ="lowernames" > true</str > <str name ="uprefix" > ignored_</str > <str name ="captureAttr" > true</str > <str name ="fmap.content" > text</str > </lst > </requestHandler >
2. ltr(Learning to Rank)模块 机器学习排序功能。
配置示例:
1 2 3 4 5 6 7 8 9 10 11 12 <config > <queryParser name ="ltr" class ="org.apache.solr.ltr.search.LTRQParserPlugin" /> <transformer name ="features" class ="org.apache.solr.ltr.response.transform.LTRFeatureLoggerTransformerFactory" > <str name ="fvCacheName" > QUERY_DOC_FV</str > </transformer > <requestHandler name ="/ltr" class ="org.apache.solr.ltr.LTRRequestHandler" /> </config >
3. scripting模块 脚本处理功能。
4. langid模块 语言识别功能。
配置示例:
1 2 3 4 5 6 7 8 <updateRequestProcessorChain name ="langid" > <processor class ="org.apache.solr.update.processor.LangDetectLanguageIdentifierUpdateProcessorFactory" > <str name ="langid.fl" > title,content</str > <str name ="langid.map.lcid" > title_en:en content_en:en</str > <str name ="langid.fallback" > en</str > </processor > <processor class ="solr.RunUpdateProcessorFactory" /> </updateRequestProcessorChain >
实际应用配置示例 1. 多模块综合配置 1 2 3 4 5 SOLR_MODULES=extracting,ltr,scripting,langid bin/solr start -Dsolr.modules=extracting,ltr,scripting,langid
2. solr.xml中的模块配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 <?xml version="1.0" encoding="UTF-8" ?> <solr > <str name ="modules" > extracting,ltr,scripting,langid</str > <solrcloud > <str name ="host" > ${host:}</str > <int name ="hostPort" > ${jetty.port:8983}</int > <str name ="hostContext" > ${hostContext:solr}</str > <bool name ="genericCoreNodeNames" > ${genericCoreNodeNames:true}</bool > <int name ="zkClientTimeout" > ${zkClientTimeout:30000}</int > <int name ="distribUpdateSoTimeout" > ${distribUpdateSoTimeout:600000}</int > <int name ="distribUpdateConnTimeout" > ${distribUpdateConnTimeout:60000}</int > <str name ="zkCredentialsProvider" > ${zkCredentialsProvider:org.apache.solr.common.cloud.DefaultZkCredentialsProvider}</str > <str name ="zkACLProvider" > ${zkACLProvider:org.apache.solr.common.cloud.DefaultZkACLProvider}</str > </solrcloud > <shardHandlerFactory name ="shardHandlerFactory" class ="HttpShardHandlerFactory" > <int name ="socketTimeout" > ${distribUpdateSoTimeout:600000}</int > <int name ="connTimeout" > ${distribUpdateConnTimeout:60000}</int > </shardHandlerFactory > </solr >
3. 集合级别的模块配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <config > <lib dir ="${solr.install.dir:../../../..}/modules/extracting/lib/" /> <lib dir ="${solr.install.dir:../../../..}/modules/scripting/lib/" /> <requestHandler name ="/update/extract" class ="solr.extraction.ExtractingRequestHandler" > <lst name ="defaults" > <str name ="lowernames" > true</str > <str name ="uprefix" > ignored_</str > </lst > </requestHandler > <updateRequestProcessorChain name ="script" > <processor class ="org.apache.solr.scripting.update.ScriptUpdateProcessorFactory" > <str name ="script" > custom-processor.js</str > </processor > <processor class ="solr.RunUpdateProcessorFactory" /> </updateRequestProcessorChain > </config >
模块管理最佳实践 1. 环境隔离 1 2 3 4 5 6 7 8 SOLR_MODULES=extracting,scripting SOLR_MODULES=extracting,ltr,scripting SOLR_MODULES=extracting,ltr
2. 按需加载策略 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <config > <lib dir ="${solr.install.dir:../../../..}/modules/extracting/lib/" /> <lib dir ="${solr.install.dir:../../../..}/modules/langid/lib/" /> </config > <config > <lib dir ="${solr.install.dir:../../../..}/modules/ltr/lib/" /> </config > <config > <lib dir ="${solr.install.dir:../../../..}/modules/scripting/lib/" /> </config >
3. 模块依赖管理 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash SOLR_HOME="/opt/solr" REQUIRED_MODULES=("extracting" "ltr" "scripting" ) for module in "${REQUIRED_MODULES[@]} " ; do if [ -d "$SOLR_HOME /modules/$module " ]; then echo "✓ Module $module is available" else echo "✗ Module $module is missing" fi done
性能和资源考虑 1. 内存使用 不同模块会消耗不同的内存资源:
1 2 3 SOLR_HEAP="2g" SOLR_JAVA_MEM="-Xms2g -Xmx4g"
2. 启动时间 1 2 bin/solr start -f -Dsolr.modules=extracting,ltr -Dlog4j.configuration=log4j-console.properties
3. 磁盘空间
故障排除 1. 模块加载失败 1 2 3 4 5 ls -la modules/find modules/extracting/lib/ -name "*.jar" | head -5
2. 类路径问题 1 2 <lib dir ="${solr.install.dir:../../../..}/modules/extracting/lib/" regex =".*\.jar" />
3. 版本兼容性 1 2 3 bin/solr version grep -r "Implementation-Version" modules/*/lib/*.jar
包管理器集成 一些模块可能已作为包管理器的包提供:
1 2 3 4 5 bin/solr package list-available bin/solr package install <package-name>
模块开发指南 1. 自定义模块结构 1 2 3 4 5 6 7 8 9 10 my-custom-module/ ├── src/ │ └── java/ │ └── com/ │ └── mycompany/ │ └── solr/ ├── lib/ │ └── my-custom-module.jar ├── build.xml └── README.md
2. 模块注册 1 2 <lib dir ="${solr.install.dir:../../../..}/modules/my-custom-module/lib/" />
总结 Solr模块系统提供了强大的扩展机制,允许用户根据需要添加特定功能。通过合理的模块配置和管理,可以构建功能丰富且性能优化的Solr解决方案。在实际使用中,应根据业务需求选择合适的模块,并注意资源使用和性能影响。模块的官方维护保证了其稳定性和与Solr核心的兼容性。