mysql数据导入solr

solrconfig.xml配置数据导入用的requestHandler和数据导入使用的jar包


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

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

配置文件可以是绝对路径、或相对集合conf/的相对路径

<dataConfig>
  <dataSource driver="com.mysql.jdbc.Driver"  url="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT" 
		user="root" password="123456" />

  <document>
    <!-- 查询实体,一行一个实体,query是查询的语句 -->
    <!-- PK属性为增量更新时需要根据哪个字段进行数据比对,只能指定一个 -->
	<!-- deltaQuery仅用于增量导入,指定增量数据pk的查询SQL -->
	<!-- deltaImportQuery  仅用于增量导入,若不添加该属性solr会默认使用query属性中的sql进行加载,容易出错。故此需要该熟悉
	     指定增量导入实体数据的查询SQL-->
    <entity name="product" query="select * from t_product" 
	        pk="prod_id" 
	        deltaQuery="select prod_id from t_product where last_modify_time > '${dataimporter.last_index_time}'"
			deltaImportQuery="select * from t_product where prod_id ='${dih.delta.prod_id}'" > 
     
	  <!-- 字段匹配。 默认是按照表中的字段进行匹配。例如:product表中的prod_id会匹配solr 中的prod_id 字段,可是
            solr 中的定义为	prodId,故需要转换  -->
	  <field column="prod_id"  name="prodId"/>
	  <field column="simple_intro"  name="simpleIntro"/>
	      
		<!-- 查询实体可进行嵌套,当需要用到外键关联是可通过${父实体name.外键} ,进行查询-->  
        <entity name ="brand" 
		        pk="id" 
		        query ="select name from t_brand where id = '${product.brand_id}'"
			    deltaQuery="select id from t_brand where last_modify_time > '${dataimporter.last_index_time}'"
			    deltaImportQuery="select * from t_brand where id = '${dih.delta.id}'"
				parentDeltaQuery="select prod_id from t_product where brand_id = '${brand.id}'">
		    <field column="name"  name="brand"/>
        </entity>
		
		<entity name ="productCat" 
		        query ="select prod_id,cat_id from t_prod_cat where prod_id = '${product.id}'"
				pk="prod_id" 
			    deltaQuery="select prod_id,cat_id from t_prod_cat where last_modify_time > '${dataimporter.last_index_time}'"
			    deltaImportQuery="select * from t_prod_cat where  id = '${dih.delta.id}'"
				parentDeltaQuery="select prod_id from t_product where brand_id = '${productCat.prod_id}'">
				
				
		     <entity name ="cat" 
			         query ="select name from t_cat where id ='${productCat.cat_id}'"
			         pk="id" 
			         deltaQuery="select id from t_cat where last_modify_time > '${dataimporter.last_index_time}'"
			         deltaImportQuery="select * from t_cat  where id = '${dih.delta.id}'"
				     parentDeltaQuery="select prod_id,cat_id from t_prod_cat where cat_id = '${cat.id}'">
			    <field column="name"  name="cat"/>
			 </entity>
        </entity>
    </entity>
  </document>
</dataConfig>

 

<document>下可包含一个或多个<entity>数据实体

entity数据实体通用属性说明

属性名描述
name (required)标识实体的唯一名
processor当数据源是非RDBMS 时,必须指定处理器。(默认是SqlEntityProcessor)
transformer要应用在该实体上的转换器。
 dataSource当配置了多个数据源时,指定使用的数据源的名字。
pk实体的主键列名。只有在增量导入时才需要指定主键列名。和模式中的唯一键是两个不同的东西
rootEntity默认document元素的子entity是rootEntity,如果把rootEntity属性设为false值,则它的子会被作为rootEntity(依次类推)。rootEntity返回的每一行会创建一个document。
onError(abort|skip|continue) . 当处理entity的行为document的过程中发生异常该如何处理:默认是 abort,放弃导入。skip:跳过这个文档,continue:继续索引该文档。
preImportDeleteQuery在全量导入前,如需要进行索引清理cleanup,可以通过此属性指定一个清理的索引删除查询,否则用的是‘*:*’(删除所有)。只有<document>的直接子Entity设置此属性有效。
postImportDeleteQuery指定全量导入后需要进行索引清理的delete查询。只有<document>的直接子Entity设置此属性有效.
query (required)从数据库中加载实体数据用的SQL语句。
deltaQuery仅用于增量导入,指定增量数据pk的查询SQL。
parentDeltaQuery指定增量关联父实体的pk的查询SQL。
deletedPkQuery仅用于增量导入,被删除实体的pk查询SQL。
deltaImportQuery(仅用于增量导入) .指定增量导入实体数据的查询SQL。如果没有指定该查询语句,solr将使用query属性指定的语句,经修改后来查询加载增量数据(这很容易出错)。在该语句中往往需要引用deltaQuery查询结果的列值,通过 ${dih.delta.<column-name>} 来引用,如:select * from tbl where id=${dih.delta.id}

 

最后拷贝mysql的驱动jar包到solr的{solr_home}/server/solr-webapp/webapp/WEB-INF/lib中。

配置完成。

在solr 的页面的dataimport 中进行配置即可。


版权声明:本文为weixin_38324270原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。