我的solr安装目录:/home/solr/
上一篇记录了sorld安装配置:https://blog.csdn.net/Muscleheng/article/details/106126886
solr数据同步:把数据库数据同步到solr,这里使用的数据库是postgresql,如果其他的数据库,配置步骤也一样,只是驱动包不一样而已
1. 上传驱动jar包
把postgresql-42.2.5.jar包放到 /home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF/lib 目录下面
把 /home/solr/solr-8.5.1/dist目录下的solr-dataimporthandler-8.5.1.jar和solr-dataimporthandler-extras-8.5.1.jar包复制到/home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF/lib 目录下面
2. 创建data-config.xml文件
2.1 存放到目录 /home/solr/solr-8.5.1/server/solr/new_core/conf/ 下面
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<!-- 数据源配置 -->
<dataSource name="source1" type="JdbcDataSource"
driver="org.postgresql.Driver"
url="jdbc:postgresql://10.2.230.6:5433/e_commerce"
user="e_commerce"
password="ggcjdss49120" />
<!-- sql 编写 -->
<!--
entity属性:
name:实体名称
dataSource:数据源名称
pk:实体主键,增量导入时使用
query:全量同步SQL
deltaQuery:增量导入时查询需要导入的数据的主键
deltaImportQuery:增量导入查询SQL,根据deltaQuery查询出的id查询数据
deletedPkQuery:增量导入时会删除solr中根据该SQL查询出来的id对应的数据
增量同步原理:首先保障数据库表里面有个记录时间的字段,每次添加或者修改后记录时间;solr每次同步数后会记录同步时间:last_index_time,
然后SQL语句里面就可以添加查询条件 :last_modify_date >= '${dih.last_index_time}',表里面更新时间大于solr的更新时间,说明数据被更新了或者是新增的数据;
last_modify_date:这个是表里面记录更新、插入时间的字段;
-->
<document>
<entity name="product" dataSource="source1" pk="product_id"
query="SELECT
pp.product_id,
pp.product_name,
pp.last_modify_date
FROM
p_product pp
WHERE
pp.valid_flag = '1'"
deltaImportQuery="SELECT
pp.product_id,
pp.product_name,
pp.last_modify_date
FROM
p_product pp
WHERE
pp.valid_flag = '1'
AND pp.product_id = '${dih.delta.product_id}'"
deltaQuery="SELECT
pp.product_id
FROM
p_product pp
WHERE
pp.valid_flag = '1'
AND pp.last_modify_date >= '${dih.last_index_time}'"
deletedPkQuery="select product_id from p_product where valid_flag='0'">
<!-- 字段对应关系 -->
<field column='product_id' name='productId' />
<field column='product_name' name='productName' />
<field column='last_modify_date' name='last_modify_date' dateTimeFormat="yyyy-MM-dd HH:mm:ss"/>
</entity>
</document>
</dataConfig>
配置文件中 last_index_time 这个时间是solr同步数据的时间,可以从这里查看:
2.2 同级目录下 /home/solr/solr-8.5.1/server/solr/new_core/conf
managed-schema 文件配置导入数据字段的对应关系
<!-- 定义文档字段
name:字段名称;type:分词类型;indexed:是否进行索引;stored:是否进行储存,需要进行显示一般需要储存;
required:字段是否可为空;multiValued:是否有多个值
-->
<field name="productId" type="strings" indexed="true" stored="true" required="false" multiValued="false" />
<field name="productName" type="text_ik" indexed="true" stored="true" required="false" multiValued="false" />
<field name="last_modify_date" type="strings"/>
managed-schema文件中默认了数据的主键,如下:
<uniqueKey>id</uniqueKey>
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
也就是说,每次导入数据都必须要有字段id否则报错;在页面导入的时候如果没有id字段,solr回自动加上该字段,并且生成不重复id;
由于数据库表里面我们的主键是商品id(productId)所以这里修改为:
<!-- 自定义唯一主键 -->
<uniqueKey>productId</uniqueKey>
<field name="productId" type="strings" indexed="true" stored="true" required="false" multiValued="false" />
把默认配置注释掉。
3. 配置完成重启服务界面操作导入数据
增量更新,先往数据库添加一条数据,时间字段时间需要大于solr同步记录时间
4. Solr时区问题:
如果solr所在服务器的时间是正确的,会发现solr的时间是不对的,比正常时间少8小时,因为solr默认使用的是UTC时间,中国是东八区时区,比UTC国际时区多8小时
所以需要修改一下solr的时间配置
在目录/home/solr/solr-8.5.1/bin/下的solr.in.sh文件:
# By default the start script uses UTC; override the timezone if needed
# SOLR_TIMEZONE="UTC"
# solr默认使用的是UTC时间,中国是东八区时区,比UTC国际时区多8小时,所以这里加8
SOLR_TIMEZONE="UTC+8"
配置完不生效,再修改同级目录下的solr文件
# solr默认使用的是UTC时间,中国是东八区时区,比UTC国际时区多8小时,所以这里加8
if [ -z "$SOLR_TIMEZONE" ]; then
# SOLR_TIMEZONE='UTC'
SOLR_TIMEZONE='UTC+8'
fi
重启solr,查看,GMT+08:00说明修改成功
5. 定时自动同步数据
5.1 下载jar包:solr-dataimportscheduler-1.2.jar 点击下载
网上的jar包功能都不全,大多数只支持增量同步,或者不支持登录验证:如果solr设置了登录验证,定时同步就访问不了了,我修改了源码,点击上面的连接可以下载,包含了jar和源码
5.2. 把jar包放到目录 /home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF/lib下面
5.3. 找到目录/home/solr/solr-8.5.1/server/solr-webapp/webapp/WEB-INF 小的web.xml ,在里面配置监听器,添加如下代码:
<!-- 定时更新数据 -->
<listener>
<listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>
</listener>
5.4. 在目录/home/solr/solr-8.5.1/server/solr/conf 下添加配置文件 dataimport.properties
注:每个core的conf目录下也有一个名字叫做dataimport.properties
的配置文件, 这个配置文件不是core下面的,不能混淆了。
文件内容:
#################################################
# #
# 定时任务执行增量更新 #
# #
#################################################
# server BASIC authorization by userName and password
# format:userName:password
# if no server BASIC authorization,please set:
# authorizationMsg=
#authorizationMsg=userName:password
# to sync or not to sync
# 同步执行更新
syncEnabled=1
#
# solr中对应得core名,可写多个,多个时用逗号“,”分隔
#
syncCores=new_core
# 没有密码验证就不用配置
# solr服务添加了登录验证,所以这里也要配置用户名和密码
# 用户名:密码
user_pwd=solr:solr@123456
# solr server name or IP address
# [defaults to localhost if empty]
# solr服务的id,定时任务服务是集成在solr服务里面的,所以都在同一台机器,所以localhost即可
# server=localhost
server=localhost
# solr服务的端口号
# [defaults to 80 if empty]
port=8983
# application name/context
# [defaults to current ServletContextListener's context (app) name]
webapp=solr
# URL params [mandatory]
# remainder of URL
#增量更新对应的访问参数,注意/dataimport?地址不同版本sorl了能地址名不同,具体可登录solr管理后台##查看dataimport的具体访问ULR
# clean=false 表示不清空以前的数据,只有全量更新才为true
params=/dataimport?command=delta-import&clean=false&commit=true&optimize=false&wt=json&indent=true&verbose=false&debug=false
# schedule interval
# number of minutes between two runs
# 定时任务执行增量更新的间隔,不能为0.5这样的数,默认设置为1分钟
interval=120
########################## 默认没有全量导入功能,可以自己写定时任务调用solr全量更新的地址,地址如下reBuildIndexParams #####################
# 重做索引的时间间隔,单位分钟,默认7200,即5天;
# 为空,为0,或者注释掉:表示永不重做索引,即全量更新的时间间隔
reBuildIndexInterval=300
# 重做索引的参数,即全量更新
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true&optimize=true&wt=json&indent=true&verbose=false&debug=false
# 重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
# 两种格式:2020-05-15 16:10:00 或者 16:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=08:30:00
重启solr 服务即可,可以通过日志查看执行情况,solr日志路径:/home/solr/solr-8.5.1/server/logs/solr.log
solr登录验证配置步骤:
https://blog.csdn.net/Muscleheng/article/details/106287777 点击跳转