和solr的N天N夜(四)--增量、定时导入并检索数据

时间:2022-08-17 07:58:34

一:引言

在上一章中导入数据的方式是全量导入,如果每次导入数据都是全量导入的话,首先是没必要,其次在海量数据下对服务器的压力也较大。所以合理的方式是更新索引采用定时增量更新。

二、修改数据库

在数据库中新增一个timestamp类型的字段,并且默认值为CURRENT_TIMESTAMP
CREATE TABLE `image_info` (
  `id` varchar(32) NOT NULL,
  `src` text,
  `update_date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

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

三、data-config.xml配置:

<dataConfig>  
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/dbname" user="root" password="***" />   
    <document>  
        <entity name="imageInfo" pk="id" query="select id,src,key_info from image_info"
deltaImportQuery="SELECT id,src,key_info FROM image_info where id='${dih.delta.id}'" 
deltaQuery="SELECT id FROM image_info where update_date > '${dih.last_index_time}'">  
            <field column="id" name="id"/>   
            <field column="src" name="src"/>   
            <field column="key_info" name="key_info"/>   
   <field column="update_date" name="update_date"/>   
        </entity>  
    </document>  
</dataConfig>

配置说明:
query:查询数据库表符合记录数据。
deltaQuery:增量索引查询主键ID,这个只能返回ID字段。
deltaImportQuery:增量索引查询导入的数据。

更新过程:
1:按照query指定的SQL语句查询出符合条件的记录。
2:从这些数据中根据deltaQuery指定的SQL语句查询出所有需要增量导入的数据的ID。
3:deltaImportQuery指定的SQL语句返回所有这些ID的数据,即为这次增量导入所要处理的数据。

核心思想:通过内置变量“${dih.delta.id}”和 “${dih.last_index_time}”来记录本次要索引的id和最近一次索引的时间。如果update_date的时间大于配置文件中记录的最后一次更新时间,则该条记录为增量数据。和solr的N天N夜(四)--增量、定时导入并检索数据

四、测试

新增一条数据之后,访问http://localhost:8080/solr/dataimport?command=delta-import即可查询到新增的数据。

五、设置增量导入索引数据为定时任务

1):solr本身提供了定时导入索引功能。

导入solr-dataimportscheduler-1.1.jar到solr工程下lib目录中。注意:如果此处导入的是apache-solr-dataimportscheduler-1.0.jar,在导入索引库的时候,会导入失败(unsupported media type错误)
由于dataimportscheduler已经很久没有维护,为solr版本一直在更新。所以在进行定时任务会报错。具体内容看下图:
和solr的N天N夜(四)--增量、定时导入并检索数据
和solr的N天N夜(四)--增量、定时导入并检索数据
从这里就可以看出下面的dataimport.proterties为什么要放到solrhome目录下,而不是solrhome/core/conf目录。

2):修改web.xml

添加定时任务监听器。
<listener>    
<listener-class>    
            org.apache.solr.handler.dataimport.scheduler.ApplicationListener    
</listener-class>    
</listener>   

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

在solrhome目录下面新建一个目录conf(注意不是solrhomecollection1下面的conf),然后用解压文件打开apache-solr-dataimportscheduler-1.0.jar文件,将里面的dataimport.properties文件拷贝过来,进行修改。(solr-dataimportscheduler-1.1.jar中没有改配置文件)下面是最终我的自动定时更新配置文件内容:
和solr的N天N夜(四)--增量、定时导入并检索数据
启动tomcat,在控制台查看输出日志就可以看到更新索引库。
一般来说要在你的项目中引入Solr需要考虑以下几点:
1、数据更新频率:每天数据增量有多大,随时更新还是定时更新
2、数据总量:数据要保存多长时间
3、一致性要求:期望多长时间内看到更新的数据,最长允许多长时间延迟
4、数据特点:数据源包括哪些,平均单条记录大小
5、业务特点:有哪些排序要求,检索条件
6、资源复用:已有的硬件配置是怎样的,是否有升级计划
和solr的N天N夜(四)--增量、定时导入并检索数据