solr8学习进阶(三)定时增量导入MySql数据

本文基于2019.10.25的solr最新版本solr-8.2.0

上一篇讲到了solr整合springboot实现资源搜索,但是还有缺陷,数据第一次手动导入之后,不能自动同步MySql数据库的数据,这一篇来讲一讲如何用solr实现定时增量导入MySql数据

一、启动solr的数据导入监听器

1、在D:\solr-8.2.0\server\solr-webapp\webapp\WEB-INF文件夹下,编辑web.xml文件,增加配置:

	<!-- solr数据导入监听器 -->
	<listener>
	  <listener-class>
			org.apache.solr.handler.dataimport.scheduler.ApplicationListener
	  </listener-class>
	</listener>

2、把导入数据所依赖的包放到D:\solr-8.2.0\server\solr-webapp\webapp\WEB-INF\lib文件加下

注意,solr官方的apache-solr-dataimportscheduler.jar包只能试用与solr6以前的版本,我们需要把apache-solr-dataimportscheduler.jar包下载下来,然后手动修改再二次打包。最终我这边打包改名成apache-solr-dataimportscheduler-xrw.jar,下载路径:百度网盘链接:https://pan.baidu.com/s/1RVjjtBKeL4iR15vzv1t-ig 提取码:rl91

二、配置自动更新

在D:\solr-8.2.0\server\solr路径下,新建conf文件夹,然后新建文件dataimport.properties,写入以下配置:

#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################
 
#  to sync or not to sync 是否同步功能
#  1 - active; anything else - inactive 1 - 开启; 否则不开启
syncEnabled=1
#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
#syncCores=game,resource 需要同步的solr core
syncCores=appDbDisasterShelter,appDbMaterialAddress,appDbProtectionobject,appDbRisk,appDbTeam
#  solr server name or IP address solr server 名称或IP地址
#  [defaults to localhost if empty] 默认为localhost
server=localhost
#  solr server port solr server端口
#  [defaults to 80 if empty] 默认为80
port=8983
#  调度区间
#  默认为30分钟
interval=1
#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr
#  URL params [mandatory]
#  remainder of URL
params=/dataimport?command=delta-import&clean=false&commit=true
#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
#  重做索引的时间间隔,单位分钟,默认7200,即5; 
#  为空,0,或者注释掉:表示永不重做索引
reBuildIndexInterval=1
 
#  重做索引的参数
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true
 
#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=03:10:00

三、编写定时自动更新的sql语句

在你的core的\conf文件加下,例如D:\solr-8.2.0\server\solr\appDbDisasterShelter\conf,编辑data-config.xml文件,添加deltaQuery、deletedPkQuery、deltaImportQuery等语句。
其中,deltaQuery用于查询比上一次数据更新操作的时间更晚的数据的id,deltaImportQuery则根据deltaQuery取到的id去MySql数据库查询数据用以更新solr中的数据。
这里,我们在数据库中用sys_i_status是否为0来表示数据的逻辑删除,业务系统每次操作数据库时更新sys_dt_last_update字段,让solr知道哪些数据更新过了。

<?xml version="1.0" encoding="UTF-8" ?>

<dataConfig>
    <!-- 数据库信息 -->
    <dataSource type="JdbcDataSource" 
        driver="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://192.168.1.160:3306/emplus_eos" 
        user="emt" password="chinaemt"/>
    <document>
        <!-- document实体 -->
        <entity name="app_db_disaster_shelter" pk="id" 
		query="SELECT `i_id` as id,
  `vc_name` as vcName,
  `d_longitude` as x,
  `d_latitude` as y,
  `vc_address` as vcAddress,
  `vc_remark` as vcRemark,
  concat( d_longitude,' ',d_latitude) as GEO
  FROM app_db_disaster_shelter where sys_i_status=0"
  deltaQuery="SELECT `i_id` AS `id` FROM `app_db_disaster_shelter` where sys_i_status=0 and sys_dt_last_update>'${dataimporter.last_index_time}'"
deletedPkQuery="SELECT `i_id` AS `id` FROM `app_db_disaster_shelter` where sys_i_status!='0'"
deltaImportQuery="SELECT `i_id` as id,
  `vc_name` as vcName,
  `d_longitude` as x,
  `d_latitude` as y,
  `vc_address` as vcAddress,
  `vc_remark` as vcRemark,
  concat( d_longitude,' ',d_latitude) as GEO
  from app_db_disaster_shelter where sys_i_status=0  and i_id='${dataimporter.delta.id}'">
            <!-- 数据库字段映射solr字段 -->
            <field column="i_id" name="id"/>
            <field column="vc_name" name="vcName"/>
            <!-- <field column="i_area_id" name="iAreaId"/> -->
            <!-- <field column="vc_dept" name="vcDept"/> -->
            <field column="d_longitude" name="x"/>
            <field column="d_latitude" name="y"/>
            <field column="vc_address" name="vcAddress"/>
            <!-- <field column="vc_traffic" name="vcTraffic"/> -->
            <!-- <field column="vc_duty_tel" name="vcDutyTel"/> -->
            <!-- <field column="vc_fax" name="vcFax"/> -->
            <!-- <field column="vc_dept_address" name="vcDeptAddress"/> -->
            <!-- <field column="vc_group" name="vcGroup"/> -->
            <!-- <field column="dt_update_time" name="dtUpdateTime"/> -->
            <field column="vc_remark" name="vcRemark"/>
            <!-- <field column="dt_use_time" name="dtUseTime"/> -->
            <!-- <field column="vc_basic_situation" name="vcBasicSituation"/> -->
            <!-- <field column="d_area" name="dArea"/> -->
            <!-- <field column="i_dept_id" name="iDeptId"/> -->
            <!-- <field column="i_operate_id" name="iOperateId"/> -->
            <!-- <field column="i_status" name="iStatus"/> -->
            <!-- <field column="i_extend1" name="iExtend1"/> -->
            <!-- <field column="i_extend2" name="iExtend2"/> -->
            <!-- <field column="vc_extend1" name="vcExtend1"/> -->
            <!-- <field column="vc_extend2" name="vcExtend2"/> -->
            <!-- <field column="vc_extend3" name="vcExtend3"/> -->
            <!-- <field column="sys_i_status" name="sysIStatus"/> -->
            <!-- <field column="sys_dt_create" name="sysDtCreate"/> -->
            <!-- <field column="sys_i_create_user" name="sysICreateUser"/> -->
            <!-- <field column="sys_dt_last_update" name="sysDtLastUpdate"/> -->
            <!-- <field column="sys_i_last_update_user" name="sysILastUpdateUser"/> -->
            <!-- <field column="sys_vc_remark" name="sysVcRemark"/> -->
            <!-- <field column="i_datasync_unit_id" name="iDatasyncUnitId"/> -->
            <!-- <field column="dt_datasync_time" name="dtDatasyncTime"/> -->
            <!-- <field column="i_datasync_id" name="iDatasyncId"/> -->
            <!-- <field column="origin" name="origin"/> -->
        </entity>
    </document>
</dataConfig>

配置完后,不要忘记重启solr进行测试哦。至此,solr的定时增量更新配置完成


上一篇:solr8学习进阶(二)整合springboot实现空间资源搜索

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
要使用Python增量导入Oracle数据Solr,您需要遵循以下步骤: 1. 安装Solr和Python的相关库(如pysolr)。 2. 编写Python脚本,连接Oracle数据库并执行增量查询,将查询结果转换为Solr文档格式,并使用pysolr库将文档添加到Solr中。 3. 您可以使用定时任务(如cron)来定期运行Python脚本,以便进行增量导入。 下面是一个示例Python脚本,用于从Oracle数据库中查询并导入数据Solr: ``` import cx_Oracle import pysolr # Oracle数据库连接配置 dsn_tns = cx_Oracle.makedsn('localhost', '1521', 'XE') conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns) cursor = conn.cursor() # Solr连接配置 solr = pysolr.Solr('http://localhost:8983/solr/mycore', timeout=10) # 查询增量数据 query = "SELECT * FROM mytable WHERE updated_at > :last_update" last_update = '2021-01-01 00:00:00' # 上次更新时间 cursor.execute(query, last_update=last_update) # 将查询结果转换为Solr文档格式 docs = [] for row in cursor: doc = { 'id': str(row[0]), 'title': row[1], 'content': row[2], 'updated_at': row[3].strftime('%Y-%m-%dT%H:%M:%SZ') } docs.append(doc) # 添加文档到Solr solr.add(docs) # 更新上次更新时间 last_update = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 关闭Oracle连接和Solr连接 cursor.close() conn.close() solr.commit() solr.close() ``` 此脚本将从Oracle数据库中查询更新时间大于上次更新时间的数据,并将查询结果转换为Solr文档格式。然后,使用pysolr库将文档添加到Solr中,并更新上次更新时间。您可以根据需要调整查询和文档格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值