Solr----4、solr7.2.0定时全量和增量更新solr索引库

在很多的项目中搜是将数据存储在关系型数据库中(如oracle、SQLServer、mysql等),对于这样数据进行搜索是很常见的,此时,你刚好采用的solr,那么就需要将数据从关系型数据库中导入solr服务器中,为了解决这个问题,神奇的Apache就提供了dataimporthandler,所谓的dataimporthandler就是提供了一种可配置的方式,向solr导入数据,可以全量导入,也可以增量导入,还可申明式提供可配置任务调度,让数据定时从关系型数据库中导入到solr服务器中。

一、环境:

win7   jdk1.8  tomcat8  solr7.2.0

二、配置数据源:

     (1)、添加依赖jar

       将solr\solr-7.2.0\dist下的solr-dataimporthandler-7.2.0.jar放在Tomcat8\solr_h\contrib\dataimporthandler\lib下,当然也可直接放在Tomcat8\webapps\solr\WEB-INF\lib下,但是不建议这么做,contrib就是添加扩展包,放在这里更加容易管理。

      将solr\solr-7.2.0\dist下的solr-dataimporthandler-extras-7.2.0.jar放在Tomcat8\solr_h\contrib\dataimporthandler-extras\lib下。

        在Tomcat8\solr_h\contrib新建db文件夹(用来存放mysql的jar包),在db文件中新建lib文件夹,将mysql-connector-java-5.1.12-bin.jar,放在lib文件夹中,这里我用的是5.1.12。

    (2)、配置core(此处是Tomcat8\solr_h\solrhome\solr_core\conf\solrconfig.xml)

        在solrconfig.xml添加以下:

  	  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
              <lst name="defaults">
                <str name="config">data-config.xml</str>
              </lst>
  	</requestHandler> 

找到lib标签处添加如下:

<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler/lib" regex=".*\.jar" />

<lib dir="${solr.install.dir:../..}/contrib/dataimporthandler-extras/lib" regex=".*\.jar" />

<lib dir="${solr.install.dir:../..}/contrib/db/lib" regex=".*\.jar" />

注意修改


我的contrib文件夹是和solrhome是同级的,在solrhome文件有sole_core.


(3)在solrconfig.xml同级目录下新建data-config.xml文件。


<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
<dataSource type="JdbcDataSource"   
		  driver="com.mysql.jdbc.Driver"   
		  url="jdbc:mysql://192.168.8.60:3306/ioms_wz_0201"   
		  user="root"   
		  password="123456"/>   
<document>   
	<entity name="document" query="SELECT documentId, fileTitle,s.DICNM AS fileType,fileName,fileExplain,isy.DICNM AS fileOmoType,b.CREATETM AS CREATETM,fileLink,downNum FROM ioms_document_b b
LEFT JOIN ioms_sysdic_s s ON s.DICVAL = b.fileType AND s.DICTP =25
LEFT JOIN ioms_sysdic_s isy ON isy.DICVAL =b.fileOmoType AND isy.DICTP =9" 
pk="documentId" deltaImportQuery="SELECT documentId, fileTitle,s.DICNM AS fileType,fileName,fileExplain,isy.DICNM AS fileOmoType,b.CREATETM AS CREATETM,fileLink,downNum FROM ioms_document_b b
LEFT JOIN ioms_sysdic_s s ON s.DICVAL = b.fileType AND s.DICTP =25
LEFT JOIN ioms_sysdic_s isy ON isy.DICVAL =b.fileOmoType AND isy.DICTP =9 where documentId='${dih.delta.documentId}'"   
deltaQuery="SELECT documentId FROM ioms_document_b b
LEFT JOIN ioms_sysdic_s s ON s.DICVAL = b.fileType AND s.DICTP =25
LEFT JOIN ioms_sysdic_s isy ON isy.DICVAL =b.fileOmoType AND isy.DICTP =9 where b.CREATETM > '${dataimporter.last_index_time}'" 
deletePkQuery="SELECT documentId FROM ioms_document_b b where b.fileStatus=2">
		 <field column="documentId" name="id"/> 
		 <field column="fileTitle" name="fileTitle"/> 
		 <field column="fileType" name="fileType"/>
		 <field column="fileName" name="fileName"/> 
		 <field column="fileExplain" name="fileExplain"/> 
		 <field column="fileOmoType" name="fileOmoType"/>
		 <field column="CREATETM" name="CREATETM"/> 
		 <field column="fileLink" name="fileLink"/>
		 <field column="downNum" name="downNum"/>
	</entity>   
</document>   

</dataConfig>
 
 

(4)相关参数说明

三、导入数据:

   (1)、solr后台服务器方式导入数据

(2)、solrJ方式导入数据

在项目中我是用读取配置文件的方式

在resources中新建comm.properties文件:

#solr服务器访问路径(以后很有可能有多可solrcore)
SOLR_URL=http://localhost:8888/solr/solr_core/
#增量更新参数dataimport固定不变    command=delta-import表示增量从mysql更新数据到solr  command=full-import表示全量从mysql更新数据到solr 
#entity=document表示要更新的entity的name,但是注意此名称非java中实体类的名称,而是solr_core中data-config.xml中的name 
#clean=false  表示增量不清空solr中数据    true表示清空数据   但是全量更新是true
#commit=true  提交必须是true
SOLR_DELTA_PARAM=/dataimport?command=delta-import&entity=document&clean=false&commit=true
SOLR_FULL_PARAM=/dataimport?command=full-import&entity=document&clean=true&commit=true
#swf软件安装路径
#SWF_URL=D:/SWFTOOL/pdf2swf.exe

在spring的核心配置文件中扫描comm.properties文件

    <!-- 数据源配置 -->
    <context:property-placeholder location="classpath:jdbc.properties,classpath:redis.properties,classpath:comm.properties" />

是用spring的定时任务,当然也可以直接使用定时器

    <!-- 定时任务 -->
	<task:scheduled-tasks>
        <!--更新定时增量更新solr索引库  每20分钟执行一次 -->
        <task:scheduled ref="autoTask" method="updateDeltaSolrData" cron="0 0/20 * * * ?"/>
        <!-- 每日凌晨3点,全量更新solr索引库 -->
        <task:scheduled ref="autoTask" method="updateFullSolrData" cron="0 0 3 * * ?"/>
	</task:scheduled-tasks> 

定时增量更新代码(全量更新也一样只是comm.properties文件中的url不同):

	/**
	 * @Title: updateSolrData 
	 * @Description: TODO(定时更新solr索引库 增量更新 20分钟一次) 
	 * @param     设定文件 
	 * @return void    返回类型 
	 * @author 
	 * @throws
	 */
	public void updateDeltaSolrData(){
		searchDocumentService.updateSolrData();
	}


	@Override
	public void updateSolrData() {
		SolrClient solr = new HttpSolrClient.Builder(SOLR_URL).build();
		SolrQuery query_s = new SolrQuery();
		query_s.setRequestHandler(SOLR_DELTA_PARAM);
		try {
			solr.query(query_s);
		} catch (Exception e) {
			e.printStackTrace();
		} 
		
	}
solr定时全量和增量更新全部完成。


猜你喜欢

转载自blog.csdn.net/m0_37044606/article/details/79348324