Solr是否自带文件夹监视器?能否替代Jenkins实现自动重索引?
好问题!针对你在用Solr 7.2的场景,确实有自带的方案能替代Jenkins+FSTrigger,实现文件夹变更后自动重新索引,不用额外依赖外部工具。核心就是利用Solr内置的**DataImportHandler(DIH)**的文件系统监控能力,下面给你详细拆解实现步骤:
一、核心方案:用Solr DataImportHandler(DIH)实现自动索引
DIH是Solr自带的数据导入工具,专门用来从各种数据源(包括本地文件系统)拉取数据并构建索引,而且原生支持监控文件系统的变化,自动触发增量或全量索引更新。
1. 确认DIH已启用
你当前创建core时用的是/opt/solr/example/files/conf这个默认配置集,它已经包含了DIH的配置,但可以快速验证:
打开resumes core的solrconfig.xml(路径一般是/var/solr/data/resumes/conf/solrconfig.xml),确认存在以下配置段:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> </lst> </requestHandler>
如果没有,手动添加这段即可。
2. 配置文件监控规则
修改core目录下的data-config.xml,配置它扫描你目标文件夹/home/chak/Documents,并处理新增/修改的文件:
<dataConfig> <!-- 用BinFileDataSource处理二进制文档(PDF、DOCX等) --> <dataSource type="BinFileDataSource" /> <document> <!-- FileListEntityProcessor负责扫描文件夹,监控文件变化 --> <entity name="file" processor="FileListEntityProcessor" baseDir="/home/chak/Documents" fileName=".*\.(docx|pdf|txt|doc)" <!-- 匹配你要索引的文档格式,按需调整 --> recursive="false" <!-- 是否递归扫描子文件夹,true表示开启 --> newerThan="${dataimporter.last_index_time}" <!-- 只处理上次索引后新增/修改的文件 --> rootEntity="false"> <!-- TikaEntityProcessor负责提取文档内容(依赖Solr的Tika集成,默认已包含) --> <entity name="document" processor="TikaEntityProcessor" url="${file.fileAbsolutePath}" format="text"> <!-- 映射提取的字段到Solr的schema字段 --> <field column="file_name" name="filename" /> <field column="file_path" name="filepath" /> <field column="text" name="content" /> <!-- 可以添加更多字段,比如文档作者、创建时间等,根据Tika支持的元数据调整 --> </entity> <!-- 可选:如果需要删除文件时同步删除Solr中的文档,添加这个删除规则 --> <deleteQuery>filepath:${file.fileAbsolutePath}</deleteQuery> </entity> </document> </dataConfig>
3. 开启自动触发机制
DIH支持两种自动触发方式,按需选择:
方式1:定时轮询(稳定通用)
在solrconfig.xml的DIH配置里添加定时任务(用CRON表达式),比如每5分钟扫描一次文件夹:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> <str name="schedule">0 0/5 * * * ?</str> <!-- CRON表达式:每5分钟执行一次增量导入 --> </lst> </requestHandler>
方式2:实时文件事件监听(更及时)
Solr 7.2支持基于Java WatchService的实时文件监控,只要在DIH配置里开启watch参数,就能在文件新增/修改/删除时立刻触发索引更新:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler"> <lst name="defaults"> <str name="config">data-config.xml</str> <str name="watch">true</str> <!-- 开启实时文件监控 --> </lst> </requestHandler>
注意:这个功能依赖系统支持Java WatchService,大部分Linux、Windows、macOS系统都没问题。
4. 权限与测试
- 确保Solr运行用户(
solr)有/home/chak/Documents文件夹的读权限,否则无法扫描文件:sudo chmod -R 755 /home/chak/Documents sudo chown -R solr:solr /home/chak/Documents - 手动测试增量导入,验证配置是否生效:
curl "http://localhost:8983/solr/resumes/dataimport?command=delta-import&clean=false&commit=true"
二、替代方案:结合系统工具(非Solr自带,仅作补充)
如果你不想用DIH,也可以用Linux的inotifywait工具监控文件夹变化,触发你原本的Post命令,但这属于系统层面的工具,不是Solr自带的,所以不如DIH集成度高。示例脚本大概是这样:
#!/bin/bash WATCH_DIR="/home/chak/Documents" inotifywait -m -r -e create,modify,delete "$WATCH_DIR" | while read dir event file; do # 执行你的索引命令 /opt/solr/bin/solr delete -c resumes sudo -u solr /opt/solr/bin/solr create -c resumes -d /opt/solr/example/files/conf /opt/solr/bin/post -c resumes /home/chak/Documents done
但这种方案需要把脚本设为后台服务,而且每次都全量删除重建,效率远不如DIH的增量更新。
总结
用Solr自带的DIH是最推荐的方案:不需要外部工具,配置全在Solr内部完成,支持增量更新,还能实时监控文件变化,完全替代Jenkins+FSTrigger的需求。
内容的提问来源于stack exchange,提问作者Chakra

