DIH增量、定时导入并检索数据--转载

原文地址:http://www.ifunit.com/984/solr%E5%AD%A6%E4%B9%A0%EF%BC%88%E4%BA%94%EF%BC%89dih%E5%A2%9E%E9%87%8F%E3%80%81%E5%AE%9A%E6%97%B6%E5%AF%BC%E5%85%A5%E5%B9%B6%E6%A3%80%E7%B4%A2%E6%95%B0%E6%8D%AE

注意:整个Solr学习系列使用的都是Solr4.5.1,更高版本应该也适用,耕地版本不知道。转载请注明出处:jiq·钦’s technical blog

(一)引言:

前面我的文章 DIH全量导入 中已经学会了如何全量导入Oralce和MySQL的数据,大家都知道全量导入在数据量大的时候代价非常大,一般来说都会适用增量的方式来导入数据,下面介绍如何增量导入MYSQL数据库中的数据,以及如何设置 定时来做。

下面介绍的所有操作都是基于前面已经完成的全量导入的基础上来做的。

(一)DIH增量从MYSQL数据库导入数据:

1、数据库表的更改:

前面已经创建好了一个UserInfo的表,这里为了能够进行增量导入,需要新增一个字段,类型为TIMESTAMP,默认值为CURRENT_TIMESTAMP。

有了这样一个字段,Solr才能判断增量导入的时候,哪些数据是新的。

因为Solr本身有一个默认值last_index_time,记录最后一次做full import或者是delta import(增量导入)的时间,这个值存储在文件conf目录的dataimport.properties文件中。

2、data-config.xml中必要属性的设置:

       <!--  transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签   --->
       <!--  query:查询数据库表符合记录数据   --->
       <!--  deltaQuery:增量索引查询主键ID    --->    注意这个只能返回ID字段
       <!--  deltaImportQuery:增量索引查询导入的数据  --->
       <!--  deletedPkQuery:增量索引删除主键ID查询  ---> 注意这个只能返回ID字段 

有关“query”,“deltaImportQuery”, “deltaQuery”的解释,引用官网说明,如下所示:

  • The query gives the data needed to populate fields of the Solr document in full-import
  • The deltaImportQuery gives the data needed to populate fields when running a delta-import
  • The deltaQuery gives the primary keys of the current entity which have changes since the last index time

最终针对步骤一中创建的UserInfo表,我们的data-config.xml文件的配置内容如下:

<dataConfig>
	<dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="root" password="passok" />
	<document>
		<entity name="userInfo" pk="UserID"
query="SELECT * FROM userinfo"
deltaImportQuery="SELECT * FROM userinfo where UserID=‘${dih.delta.UserID}‘"
deltaQuery="SELECT UserID FROM userinfo where UpdateTime > ‘${dataimporter.last_index_time}‘">
			<field column="UserID" name="id"/>
			<field column="UserName" name="userName"/>
			<field column="UserAge" name="userAge"/>
			<field column="UpdateTime" name="updateTime"/>
		</entity>
  	</document>
</dataConfig>

意思是首先按照query指定的SQL语句查询出符合条件的记录。

然后从这些数据中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID号。

最后根据deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。

核心思想是:通过内置变量“${dih.delta.id}”和 “${dataimporter.last_index_time}”来记录本次要索引的id和最近一次索引的时间。

注意:刚新加上的UpdateTime字段也要在field属性中配置,同时也要在schema.xml文件中配置:<field name="updateTime" type="date" indexed="true" stored="true" />

3、测试增量导入:

在浏览器中输入:http://localhost:8087/solr/dataimport?command=delta-import  然后到http://localhost:8087/solr/#/collection1/query检索一条不存在的数据,然后利用SQL语句插入一条数据:

INSERT INTO `test`.`userinfo`
(`UserID`,
`UserName`,
`UserAge`)
VALUES
(6,
‘季义钦增量数据测试‘,
25);

再次在浏览器中数据刚才的连接,再次检索。

(二)设置增量导入为定时执行的任务:

很多人利用Windows计划任务,或者Linux的Cron来定期访问增量导入的连接来完成定时增量导入的功能,这其实也是可以的,而且应该没什么问题。

但是更方便,更加与Solr本身集成度高的是利用其自身的定时增量导入功能。

1、下载apache-solr-dataimportscheduler-1.0.jar放到Tomcat的webapps的solr目录的WEB-INF的lib目录下:

下载地址:http://code.google.com/p/solr-dataimport-scheduler/downloads/list

也可以到我的云盘下载:http://pan.baidu.com/s/1dDw0MRn

2、修改solr的WEB-INF目录下面的web.xml文件:

为<web-app>元素添加一个子元素

<listener>
 	<listener-class>
         	org.apache.solr.handler.dataimport.scheduler.ApplicationListener
 	</listener-class>
  </listener>

3、新建配置文件dataimport.properties:

在SOLR_HOME\solr目录下面新建一个目录conf(注意不是SOLR_HOME\solr\collection1下面的conf),然后用解压文件打开apache-solr-dataimportscheduler-1.0.jar文件,将里面的dataimport.properties文件拷贝过来,进行修改,下面是最终我的自动定时更新配置文件内容:

#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################

#  to sync or not to sync
#  1 - active; anything else - inactive
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 #因为我的是single-core,所以注释掉了,默认就是collection1

#  solr server name or IP address
#  [defaults to localhost if empty]
server=localhost

#  solr server port
#  [defaults to 80 if empty]
port=8087

#  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=true&commit=true

#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
#  这里配置的是2min一次
interval=2

#  重做索引的时间间隔,单位分钟,默认7200,即5天;
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200

#  重做索引的参数
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

至此就完成了定时增量更新的配置,启动tomcat服务器,不需要再浏览器请求增量导入了,可以看到已经开始定期增量更新了。

================================ 一般来说要在你的项目中引入Solr需要考虑以下几点:

1、数据更新频率:每天数据增量有多大,随时更新还是定时更新
2、数据总量:数据要保存多长时间
3、一致性要求:期望多长时间内看到更新的数据,最长允许多长时间延迟
4、数据特点:数据源包括哪些,平均单条记录大小
5、业务特点:有哪些排序要求,检索条件
6、资源复用:已有的硬件配置是怎样的,是否有升级计划

时间: 2024-11-10 05:49:03

DIH增量、定时导入并检索数据--转载的相关文章

DOS 选择跳转实现、dos + bcp 双击导入和导出数据

DOS 选择跳转实现.dos + bcp 双击导入和导出数据 option.bat @echo off :Start2 cls goto Start :Start title Frequently Used Websites echo Please select a website from the list echo with the corresponding key echo -------------------------------------- echo [1] Google ec

Solr定时导入功能实现

需要实现Solr定时导入功能的话,我们可以通过使用Solr自身所集成的dataimportscheduler调度器实现 下载对应的jar包,下载地址https://code.google.com/archive/p/solr-dataimport-scheduler/downloads 通过WinRAR打开jar包我们发现里面有一个名叫dataimport.properties的配置文件 ################################################# # #

php上传xls文件导入到mysql数据表

申明下面的文章属于转载,现在大家新下载的版本跟下面列子这个不一样!我看了很多网上的列子,最后我还是读了那个英文的手册,上面说的很清楚!大家英语不好可以下载有道!其实重点是要包含下面两行: require_once 'excellib/PHPExcel.php'; require_once 'excellib/PHPExcel/IOFactory.php'; 你们各自的替换各自存放目录,我这里用的是excellib目录.就是要把PHPExcel.php',PHPExcel/IOFactory.ph

oracle 增量导出/导入

一.   导出/导入(Export/Import) ----   利用Export可将数据从数据库中提取出来,利用Import则可将提取出来的数据送回Oracle数据库中去. ----   1.   简单导出数据(Export)和导入数据(Import) ----   Oracle支持三种类型的输出: ----   (1)表方式(T方式),将指定表的数据导出. ----   (2)用户方式(U方式),将指定用户的所有对象及数据导出. ----   (3)全库方式(Full方式),将数据库中的所有

mysql的导入和导出数据,删除数据

本文转自网络优秀的文章 详细可以参考https://www.cnblogs.com/Cherie/p/3309456.html https://www.cnblogs.com/roverliang/p/6436140.html https://www.cnblogs.com/mkfywj/p/5452045.html https://www.cnblogs.com/waynechou/p/7794939.html 删除表内容,不删除表结构 truncate table 表名    --自动增长的

SQL基础 利用SELECT检索数据

SELECT [DISTINCT|ALL]  SELECT_LIST FROM TABLE_LIST [WHERE+CLAUSE] [GROUP_BY_CLAUSE] [HAVING CONDITION] [ORDER_BY_CLAUSE] 使用别名代替数据库中的字段名(AS可去除用空格,但不利于阅读) SELECT COLIMN_NAME1 AS 别名1,…COLUMN_NAME2 || ’*’ || 1.23 || ’=’ || COLUMN_NAME2 * 1.23 AS 别名2 FROM

mysql数据导入到sqlite数据

在做程序时,sqlite数据很方便.用mysql数据导出到sqlite的步骤:(用csv文件过渡) -------------------------------  先导出到csv文件  ------------------------- 1.用navicat软件将mysql数据导出到txt文件. 2.注意选择“包含列标题”(字段名).“栏位定界符”(csv文件使用逗号). 3.把所有的txt文件转换为utf-8编码. 4.写一个rename.bat(ren *.txt *.csv),全部统一改

Mysql导入导出大量数据的方法、备份恢复办法

经常使用PHP+Mysql的朋友一般都是通过phpmyadmin来管理数据库的.日常的一些调试开发工作,使用phpmyadmin确实很方便.但是当我们需要导出几百兆甚至几个G的数据库时,phpmyadmin就会很卡.甚至如果你是想导入大量数据,则phpmyadmin完全无法完成.因为phpmyadmin是基于PHP网页的,无法上传太大的sql文件.其实mysql官方给了我们很好的解决方案:mysqldump. 下面介绍,如何在Windows环境下,使用mysqldump导出数据库: 找到你mys

Oracle Imp and Exp (导入和导出) 数据 工具使用

Oracle 提供两个工具imp.exe 和exp.exe分别用于导入和导出数据.这两个工具位于Oracle_home/bin目录下. 导入数据exp 1 将数据库ATSTestDB完全导出,用户名system 密码123456 导出到c:\export.dmp中 exp system/[email protected] file=c:\export.dmp full=y 其中ATSTestDB为数据库名称,system为该数据库里的账户,123456为其密码. 2 将数据库中system用户与