solr增量更新之同步(添加、修改、删除)

solr增量索引配置 
1.在进行增量索引前,首先要弄懂几个必要的属性,以及数据库建表事项,和dataimporter.properties 
                   data-config.xml里面的数据 
  <!--  transformer 格式转化:HTMLStripTransformer 索引中忽略HTML标签   ---> 
  <!--  query:查询数据库表符合记录数据   ---> 
  <!--  deltaQuery:增量索引查询主键ID    --->    注意这个只能返回ID字段 
  <!--  deltaImportQuery:增量索引查询导入数据  ---> 
  <!--  deletedPkQuery:增量索引删除主键ID查询  ---> 注意这个只能返回ID字段 

数据库配置注意事项 
1.如果只涉及添加,与修改业务,那么数据库里只需额外有一个timpstamp字段 
就可以了,默认值为当前系统时间,CURRENT_TIMESTAMP(笔者的数据为mysql的) 
2.如果还涉及删除业务,那么数据里就需额外再多添加一个字段isdelete,int类型的 
用0,1来标识,此条记录是否被删除,当然也可以用其他字段标识,ture或false都可以 

dataimporter.properties 
这个配置文件很重要,它是用来记录当前时间与上一次修改时间的,通过它能够找出,那些,新添加的,修改的,或删除的记录

 

下面为笔者当时测试时的一个演示,其中添加,修改,删除,都涉及了

 

 1. 下载jar包solr-dataimporthandler-extras-6.6.2、apache-solr-dataimportscheduler-1.1、solr-dataimporthandler-6.6.2添加到E:\solr\server\solr-webapp\webapp\WEB-INF\lib目录下。所需jar包下载
 2. 修改web.xml文件配置监听,在servlet节点前增加:

<listener>
          <listener-class>
                org.apache.solr.handler.dataimport.scheduler.ApplicationListener
          </listener-class>
</listener>

3.在E:\solr\server\solr目录先创建conf文件夹并在此文件夹下创建dataimport.properties文件,并根据实际情况进行修改,内容如下:

#################################################
#                                              #
#      dataimport scheduler properties        #
#                                              #
#################################################
 
#  tosync or not to sync
#  1- active; anything else - inactive
# 这里的配置不用修改
syncEnabled=1
 
# which cores to schedule
#  ina multi-core environment you can decide which cores you want syncronized
# leave empty or comment it out if using single-core deployment
#  修改成你所使用的core,我这里是我自定义的core:simple
syncCores=new_core,shoeproduct
 
# solr server name or IP address
# [defaults to localhost if empty]
这个一般都是localhost不会变
server=localhost
 
# solr server port
# [defaults to 80 if empty]
#  安装solr的tomcat端口,如果你使用的是默认的端口,就不用改了,否则改成自己的端口就好了
port=8983
 
# application name/context
# [defaults to current ServletContextListener's context (app) name]
#  这里默认不改
webapp=solr
 
# URL params [mandatory]
# remainder of URL
#  这里改成下面的形式,solr同步数据时请求的链接
params=/dataimport?command=delta-import&clean=false&commit=true
 
# schedule interval
# number of minutes between two runs
# [defaults to 30 if empty]
#这里是设置定时任务的,单位是分钟,也就是多长时间你检测一次数据同步,根据项目需求修改
#  开始测试的时候为了方便看到效果,时间可以设置短一点
interval=1
 
#  重做索引的时间间隔,单位分钟,默认7200,即5天;
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200
 
#  重做索引的参数
reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true
 
#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2012-04-11 03:10:00 或者 03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=03:10:00

4.db-data-config.xml文件中内容如下:

<dataConfig>
    <!---   此段话配置的是一个MySQL的数据源,(数据源也可以配置在solrconfig.xml中)  --->
    <dataSource driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/shoe?characterEncoding=utf-8" user="root" password="root" />
    <document>
            <!--  下面分别来介绍属性(如有错误,欢迎指出) -->
             <!--  pk="ID" 这个很有必要,因为其中的增量索引查询主键ID时需要  -->
              <!--  dataSource="mydb"   这个引用名字是引用上面数据源的名字 -->
              <!--  name="myinfo"   这个名字必须唯一,存在多个实体时 -->
               <!--  query="select  *  from myinfo WHERE isdelete=0   query查询是指
               查询出表里所有的符合条件的数据,因为笔者测试的有删除业务,所以
               where  后面有一个限定条件isdelete=0,意思为查询未被删除的数据
               
               (注意这个query查询只对第一次全量导入有作用,对增量导入不起作用)
               -->
               <!--
               deltaQuery="select productId from product where modifyTime > '${dataimporter.last_index_time}'"
               deltaQuery的意思是,查询出所有经过修改的记录的ID
               可能是修改操作,添加操作,删除操作产生的
               (此查询只对增量导入起作用,而且只能返回ID值)
               -->
               <!--
               deletedPkQuery="select productId from product where isdelete=-1" 
               此操作值查询那些数据库里伪删除的数据的ID(即isdelete标识为-1的数据)
               solr通过它来删除索引里面对应的数据
               (此查询只对增量导入起作用,而且只能返回ID值)
               -->
               <!--
                deltaImportQuery="select * from product where productId = '${dih.delta.productId}'"
                次查询是获取以上两步的ID,然后把其全部数据获取,根据获取的数据
                对索引库进行更新操作,可能是删除,添加,修改
                (此查询只对增量导入起作用,可以返回多个字段的值,一般情况下,都是返回所有字段的列)
               -->
                    <entity name="item" pk="productId"
			query="select * from product"
			deltaQuery="select productId from product where modifyTime > '${dataimporter.last_index_time}'"
			deletedPkQuery="select productId from product where isdelete=-1"
			deltaImportQuery="select * from product where productId = '${dih.delta.productId}'"
				>
                <!--  此条记录有必要说一下productId与上面语句中的对应起来---->
                <field column="productId" name="productId" />
			<field column="productName" name="productName" />
			<field column="productTitle" name="productTitle" />
			<field column="productTapprice" name="productTapprice" />
			<field column="productAgio" name="productAgio" />
			<field column="productStock" name="productStock" />
			<field column="productStatus" name="productStatus" />
			<field column="productUrl" name="productUrl" />
			<field column="modifyTime" name="modifyTime" />
        </entity>
    </document>
</dataConfig>

5.添加这个文件,solr会根据这个文件的修改时间同步数据

内容如下:

#Fri Oct 12 13:27:59 UTC 2018
item.last_index_time=2018-10-12 13\:27\:58
last_index_time=2018-10-12 13\:27\:58

 

最后重启solr,在数据库中添加一条数据,静等一分钟,然后query。因为我们设置的是一分钟监听一次。


切记modifyTime 的更新时间一定要比last_index_time的时间晚。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Solr是一个强大的搜索引擎,支持增量更新,可以通过Java代码实现Solr增量更新增量更新是指只更新发生了改变的数据,而不是全部数据。实现方式可以通过在每个数据上添加时间戳或者版本号,当数据发生改变时,只更新时间戳或者版本号发生了改变的数据。 下面是一个使用Java代码实现Solr增量更新的示例: ```java // 创建SolrClient对象 SolrClient solrClient = new HttpSolrClient.Builder("http://localhost:8983/solr/my_core").build(); // 创建SolrInputDocument对象 SolrInputDocument document = new SolrInputDocument(); document.addField("id", "1"); document.addField("name", "new name"); document.addField("timestamp", new Date()); // 创建UpdateRequest对象 UpdateRequest updateRequest = new UpdateRequest(); updateRequest.add(document); updateRequest.setAction(AbstractUpdateRequest.ACTION.COMMIT, true, true); // 执行增量更新操作 UpdateResponse response = updateRequest.process(solrClient); solrClient.close(); ``` 在这个示例中,我们创建了一个SolrClient对象,指定了Solr服务器的地址和core名称。然后创建了一个SolrInputDocument对象,添加了需要更新的数据字段,包括id、name和timestamp。接着,我们创建了一个UpdateRequest对象,并将SolrInputDocument对象添加到UpdateRequest对象中。最后,执行增量更新操作,并关闭SolrClient对象。 需要注意的是,Solr需要在schema.xml中配置时间戳或版本号字段,以支持增量更新。在上面的示例中,我们添加了一个名为timestamp的时间戳字段,Solr会根据这个字段来判断是否需要更新数据。 总的来说,使用Java代码实现Solr增量更新非常简单,只需要创建SolrClient对象、SolrInputDocument对象和UpdateRequest对象,然后执行增量更新操作即可。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值