DIH配置及使用@SOLR7实践(二)

DIH配置及使用

网上已经有很多相关文章了,但是实践中还是遇到了些问题,备忘一下。

一、配置solrconfig.xml

编辑/var/solr/data/new_core/conf/solrconfig.xml
在第75行左右增加dih的jar包引用

    #新增dih配置
    <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
    #以下是原有配置
    <lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
    <lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />

在第680行左右增加

  #新增dih配置
  <requestHandler name="/dataimport" class="solr.DataImportHandler">
    <lst name="defaults">
      <str name="config">db-data-config.xml</str>
    </lst>
  </requestHandler>
  #以下是原有配置
  <requestHandler name="/select" class="solr.SearchHandler">

二、配置db-data-config.xml

编辑/var/solr/data/new_core/conf/db-data-config.xml

<dataConfig>
    <dataSource name="DS1" driver="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@**ip**:1521:****" user="**user**" password="**pwd**" />
    <dataSource name="DS2" driver="com.ibm.db2.jcc.DB2Driver" url="jdbc:db2://**ip**:50000/****" user="****" password="****"/>
    <document >
        <entity name="DS1ENTITY" dataSource="DS1" pk="ID" transformer="ClobTransformer" 
        query="SELECT * FROM DS1TB_2_SLR_DATA WHERE ENABLE=1"
        deltaQuery="SELECT ID FROM DS1TB_2_SLR_DATA WHERE ENABLE=1 AND TO_CHAR(LASTMODTIME,'yyyy-mm-dd') > to_char(to_date(substr('${dataimporter.DS1ENTITY.last_index_time}',1,10),'yyyy-mm-dd')-1 day, 'yyyy-mm-dd')"
        deltaImportQuery="SELECT * FROM DS1TB_2_SLR_DATA WHERE ID = '${dataimporter.DS1ENTITY.delta.id}'"
        deletedPkQuery="SELECT * FROM DS1TB_2_SLR_DATA WHERE ENABLE=0"
        >
            <field column="ID" name="id" />
            <field column="CONTENT" name="content" clob="true"/>
        </entity>

        <entity name="DS2ENTITY" dataSource="DS2" pk="ID" transformer="ClobTransformer" 
        query="SELECT * FROM DS2ENTITY_2_SLRSRCH_DATA"
        deltaQuery="SELECT ID FROM DS2ENTITY_2_SLRSRCH_DATA WHERE TO_CHAR(LASTMODTIME,'yyyy-mm-dd') > to_char(to_date(substr('${dataimporter.DS2ENTITY.last_index_time}',1,10),'yyyy-mm-dd')-1, 'yyyy-mm-dd')"
        deltaImportQuery="SELECT * FROM DS2ENTITY_2_SLRSRCH_DATA WHERE ID = '${dataimporter.DS2ENTITY.delta.id}'"
        deletedPkQuery="SELECT * FROM DS2ENTITY_2_SLRSRCH_DATA_DELETE"
        >
            <field column="ID" name="id" />
            <field column="CONTENT" name="content" clob="true"/>
        </entity>
    </document>
</dataConfig>

entity节点SQL相关属性

属性名 作用
query 定义全量导入数据的查询SQL
deltaQuery 定义增量导入数据主键的查询SQL
deltaImportQuery 定义增量导入数据全部字段的查询SQL
deletedPkQuery 定义增量导入删除数据的查询SQL
parentDeltaQuery 定义增量导入嵌套子entity更新父entity的SQL

配置时遇到的一些问题
多个datasource的配置,dataConfig节点下增加dataSource节点,并需要在entity节点中显示设置dataSource属性,单一dataSource节点时,entity节点中可以不配置dataSource属性;
由于业务系统的存储文字的blob字段保存的是加密后的内容,所以先使用数据库函数将blob字段处理为clob字段,再在entity的节点增加属性transformer=“ClobTransformer”,并在entity节点下的field节点指定clob字段,注意field节点的column和name两个属性字段名的大小写;
SQL中用到了DataImporthandler中的变量,${dataimporter.entity名.last_index_time}和${dataimporter.entity名.delta.id}分别表示entity的最后更新时间和entity的增量导入时更新的主键,很多文章在介绍这两个变量时,省略中间的entity名,对于单一entity是没问题的,但是配置多个entity每次增量更新一个entity时,${dataimporter.last_index_time}取到的最后更新时间是所有entity中最后更新时间,而不是更新的entity的最后更新时间;
SOLR对时间类型字段处理是有时区问题的!数据库里字段和SOLR索引后的字段时间是不一样的,原因是SOLR会将时间类型字段转换到UTC时区来处理。如果只是用时间字段来进行排序,几乎没有影响,但如果需要展示时间字段,那就有问题了。网上有文章讲怎样修正SOLR源码,支持其他时区,具体方法请自行搜索。我使用了一个变通的方法,即在solr索引中定义一个字符串字段,将时间类型字段copy到字符串字段中,排序时使用时间类型字段,显示时使用字符串字段;
entity是可以嵌套的,但会降低SOLR的加载速度。

三、数据库驱动安装

网上有文章提到将数据库驱动放在/opt/solr/contrib/extraction/lib目录下,当然没有问题;
还有一种方法,在/var/solr/data/new_core下建目录lib,并将数据库驱动放在该目录下,两者的区别只是在于影响的范围。

需要重启一下SOLR服务,让以上修改生效。
在new_core下的Dataimport菜单,点击Execute按钮,得到如下页面,表示你已经导入成功了。
SOLR7实践(二)--DIH配置及使用

当然即使有错误,也有可能看到这个页面,需要检查一下日志。
日志所在目录 /var/solr/logs/solr.log。

四、dataimport.properties

这个文件不要创建也不需要配置,再页面执行过Dataimport后,会自动生成这个文件,其所在目录/var/solr/data/new_core/conf。

单独讲dataimport.properties这个文件,其实还是SOLR时区的原因。如果不修改SOLR的时区,在dataimport.properties文件中的时间,将会是UTC时区的时间。db-data-config.xml中通过${dataimporter.last_index_time}取得的时间也不是所需要的。

五、DIH使用

明日再写

相关文章: