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

一:引言

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

二、修改数据库

在数据库中新增一个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的时间大于配置文件中记录的最后一次更新时间,则该条记录为增量数据。

四、测试

新增一条数据之后,访问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版本一直在更新。所以在进行定时任务会报错。具体内容看下图:


从这里就可以看出下面的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中没有改配置文件)下面是最终我的自动定时更新配置文件内容:

启动tomcat,在控制台查看输出日志就可以看到更新索引库。
一般来说要在你的项目中引入Solr需要考虑以下几点:
1、数据更新频率:每天数据增量有多大,随时更新还是定时更新
2、数据总量:数据要保存多长时间
3、一致性要求:期望多长时间内看到更新的数据,最长允许多长时间延迟
4、数据特点:数据源包括哪些,平均单条记录大小
5、业务特点:有哪些排序要求,检索条件
6、资源复用:已有的硬件配置是怎样的,是否有升级计划


  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要使用Python增量导入Oracle数据Solr,您需要遵循以下步骤: 1. 安装Solr和Python的相关库(如pysolr)。 2. 编写Python脚本,连接Oracle数据库并执行增量查询,将查询结果转换为Solr文档格式,并使用pysolr库将文档添加到Solr中。 3. 您可以使用定时任务(如cron)来定期运行Python脚本,以便进行增量导入。 下面是一个示例Python脚本,用于从Oracle数据库中查询并导入数据Solr: ``` import cx_Oracle import pysolr # Oracle数据库连接配置 dsn_tns = cx_Oracle.makedsn('localhost', '1521', 'XE') conn = cx_Oracle.connect(user='username', password='password', dsn=dsn_tns) cursor = conn.cursor() # Solr连接配置 solr = pysolr.Solr('http://localhost:8983/solr/mycore', timeout=10) # 查询增量数据 query = "SELECT * FROM mytable WHERE updated_at > :last_update" last_update = '2021-01-01 00:00:00' # 上次更新时间 cursor.execute(query, last_update=last_update) # 将查询结果转换为Solr文档格式 docs = [] for row in cursor: doc = { 'id': str(row[0]), 'title': row[1], 'content': row[2], 'updated_at': row[3].strftime('%Y-%m-%dT%H:%M:%SZ') } docs.append(doc) # 添加文档到Solr solr.add(docs) # 更新上次更新时间 last_update = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 关闭Oracle连接和Solr连接 cursor.close() conn.close() solr.commit() solr.close() ``` 此脚本将从Oracle数据库中查询更新时间大于上次更新时间的数据,并将查询结果转换为Solr文档格式。然后,使用pysolr库将文档添加到Solr中,并更新上次更新时间。您可以根据需要调整查询和文档格式。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值