Solr配置:模块系统详解与安装配置指南

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.in.sh中设置
SOLR_MODULES=extracting,ltr

# 或在solr.in.cmd中设置
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节点启用

常用模块介绍

1. extracting模块

用于提取和索引富文本文档(PDF、Word、Excel等)。

1
2
# 启用extracting模块
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
# 启用ltr模块
SOLR_MODULES=ltr

配置示例:

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>

<!-- LTR请求处理器 -->
<requestHandler name="/ltr" class="org.apache.solr.ltr.LTRRequestHandler"/>
</config>

3. scripting模块

脚本处理功能。

1
2
# 启用scripting模块
SOLR_MODULES=scripting

4. langid模块

语言识别功能。

1
2
# 启用langid模块
SOLR_MODULES=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
<!-- solrconfig.xml -->
<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.in.sh)
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
# 为模块调整JVM内存设置
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
2
# 检查模块占用空间
du -sh modules/*/lib/

故障排除

1. 模块加载失败

1
2
3
4
5
# 检查模块是否存在
ls -la modules/

# 检查模块依赖
find modules/extracting/lib/ -name "*.jar" | head -5

2. 类路径问题

1
2
<!-- 在solrconfig.xml中明确指定路径 -->
<lib dir="${solr.install.dir:../../../..}/modules/extracting/lib/" regex=".*\.jar" />

3. 版本兼容性

1
2
3
# 检查Solr版本和模块版本匹配
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
<!-- 在solrconfig.xml中注册自定义模块 -->
<lib dir="${solr.install.dir:../../../..}/modules/my-custom-module/lib/" />

总结

Solr模块系统提供了强大的扩展机制,允许用户根据需要添加特定功能。通过合理的模块配置和管理,可以构建功能丰富且性能优化的Solr解决方案。在实际使用中,应根据业务需求选择合适的模块,并注意资源使用和性能影响。模块的官方维护保证了其稳定性和与Solr核心的兼容性。

© 2025 Solr Community of China All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero