在很多的项目中搜是将数据存储在关系型数据库中(如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后台服务器方式导入数据
在项目中我是用读取配置文件的方式
在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定时全量和增量更新全部完成。