Solr作为一种强大的企业级搜索服务器,其核心功能是对数据进行索引和检索,Solr本身并不直接存储业务数据,而是通过连接外部数据库(如MySQL、Oracle、PostgreSQL等)来获取数据,并将其构建成倒排索引以实现高效的搜索,本文将详细介绍Solr如何连接数据库,涵盖配置步骤、关键参数及常见问题,帮助读者顺利完成数据集成。

准备工作:环境与依赖
在配置Solr连接数据库之前,需确保以下环境就绪:
- Solr服务正常运行:下载并解压Solr,通过
bin/solr start命令启动服务。 - 目标数据库可访问:确保数据库服务运行正常,且Solr服务器能够通过IP、端口及凭据连接到数据库。
- 数据库驱动依赖:根据数据库类型,下载对应的JDBC驱动jar包(如MySQL的
mysql-connector-java),并将其放置到Solr的server/solr-webapp/webapp/WEB-INF/lib/目录下,重启Solr服务以加载驱动。
配置Data Import Handler(DIH)
Solr通过Data Import Handler(DIH)模块实现数据库连接与数据同步,以下是具体配置步骤:
在solrconfig.xml中注册DIH
编辑Solr核心的配置文件solrconfig.xml(位于server/solr/core_name/conf/),添加DIH的请求处理器声明:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
此处指定了DIH的配置文件为data-config.xml,需在同一目录下创建该文件。
编写data-config.xml配置数据源
在data-config.xml中定义数据库连接、数据查询及字段映射:

<dataConfig>
<dataSource type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://数据库IP:端口/数据库名"
user="用户名"
password="密码"/>
<document name="documents">
<entity name="item"
query="SELECT id, name, description, price FROM products"
deltaImportQuery="SELECT id, name, description, price FROM products WHERE id='${dih.delta.id}'"
deltaQuery="SELECT id FROM products WHERE last_modified > '${dih.delta.last_modified}'">
<field column="id" name="id"/>
<field column="name" name="name"/>
<field column="description" name="description"/>
<field column="price" name="price"/>
</entity>
</document>
</dataConfig>
- dataSource标签:配置数据库连接参数,
driver为JDBC驱动类名,url为数据库连接字符串。 - entity标签:定义数据查询逻辑,
query为基础全量查询,deltaImportQuery与deltaQuery用于增量更新(需数据库支持时间戳或自增ID)。 - field标签:将数据库列映射到Solr的schema字段。
配置Solr Schema字段映射
确保schema.xml中已定义与数据库字段对应的Solr字段,并设置正确的类型(如string、text_general、pdouble等)。
<field name="id" type="string" indexed="true" stored="true" required="true"/> <field name="name" type="text_general" indexed="true" stored="true"/> <field name="description" type="text_general" indexed="true" stored="true"/> <field name="price" type="pdouble" indexed="true" stored="true"/>
执行数据导入与同步
全量导入
通过Solr Admin UI或HTTP请求触发全量数据导入:
- UI方式:访问
http://localhost:8983/solr/core_name/dataimport,选择Execute下的Full Import。 - 请求方式:发送HTTP POST请求:
curl "http://localhost:8983/solr/core_name/dataimport?command=full-import"
增量导入
若需同步新增或修改的数据,使用增量导入:
curl "http://localhost:8983/solr/core_name/dataimport?command=delta-import"
注意:增量导入依赖deltaQuery和deltaImportQuery,需确保数据库表包含时间戳(如last_modified)或自增ID字段。
定时同步
通过Solr的ScheduledIndexer插件或外部定时任务(如Linux Cron、Windows任务计划)定期执行增量导入,实现数据自动同步。

常见问题与优化
- 连接超时:检查数据库防火墙设置,或在
dataSource中添加connectionTimeout参数(单位:毫秒)。 - 性能优化:
- 对查询字段建立数据库索引,减少查询耗时。
- 使用
batchSize参数控制每次导入的记录数,避免内存溢出。
- 字符编码问题:确保数据库、JDBC驱动及Solr的字符集一致(如UTF-8),避免乱码。
相关问答FAQs
Q1:Solr连接数据库时出现“Driver not found”错误,如何解决?
A:此错误表明JDBC驱动未加载,请确认驱动jar包已正确放置到solr-webapp/WEB-INF/lib/目录,并重启Solr服务,若问题依旧,检查data-config.xml中的driver类名是否与驱动包中的类一致(如MySQL驱动为com.mysql.cj.jdbc.Driver而非旧版com.mysql.jdbc.Driver)。
Q2:增量导入时,如何确保只同步变更的数据?
A:需在entity标签中配置deltaQuery和deltaImportQuery,若数据库表包含时间戳字段updated_at,可设置:
<entity name="item"
deltaQuery="SELECT id FROM products WHERE updated_at > '${dataimporter.last_index_time}'"
deltaImportQuery="SELECT id, name, description, price FROM products WHERE id='${dih.delta.id}'">
其中${dataimporter.last_index_time}为DIH内置变量,记录上次同步时间,每次增量导入时,deltaQuery会查询该时间点之后变更的ID,再通过deltaImportQuery获取完整数据。