SOLR增量索引--删除业务、定时增量索引

12/12/2015来源:Java教程人气:3262

  Ok,我又来写SOLR的内容了,昨天做了修改和增加的增量索引,今天来说说关于删除的增量索引以及定时更新增量索引,废话不多说,下面进入正文。

 一、增量索引之删除

  昨天已经说过,增量索引其实就是SOLR对上次做过(增量或者全量)索引之后到这次做索引之间的这段时间数据库发生变化的数据进行创建索引,昨天我们说了增加一条数据或者修改一条数据之后创建增量索引,现在来说删除数据的增量索引。

  其实这里所说的删除是假删除,什么意思呢?就是并不是说在数据库中把某些数据给彻底删除掉,而是说给你不想创建索引的数据一个标识符,然后告诉solr,有这个标识符的数据你就不要给我创建索引了,我不需要,然后solr创建索引的时候就会忽视这些有特殊标识符的数据,大概的原理就是这样的,那么怎么实现的呢?下面来看:

  1.1数据库新增字段

  昨天做新增的增量索引的时候需要在数据库添加一个字段,今天做删除的,还是需要一个字段,然后用这个字段来标示数据是否需要创建索引,字段如下所示:

  

  字段名称大家可以自己看着定,类型给个int就行,至于长度也随意,我的是0表示需要创建索引的数据,1表示不需要创建索引的数据,也就是我所说的假删除的数据。

  1.2修改配置文件

  同样,需要将该字段配置到data-config.xml和schema.xml文件中,如下所示:

  data-config.xml

  

  注意圈起来的三个地方,首先肯定是需要把isdelete字段变成一个file标签,其次,需要query语句需要添加上where条件,查询出数据库中所有的需要创建索引的数据,然后再添加一个deletedPKQuery语句,这条语句和deltaQuery与deltaImportQuery语句一样,都是只有在做增量索引的时候起作用,deletedPKQuery是查询出所有假删除的数据的ID,然后由deltaImportQuery查询出这些ID对应的记录的全部数据,然后在已经创建的索引中删除掉这一部分索引。

  schema.xml

  schema.xml文件中倒是没有什么大的变化,只需要把isdelete字段添加进来即可:

  

1.3查看效果

按照上面的配置即可,然后我们来看一下效果,首先是数据库:

还是昨天的17条数据。

SOLR已经创建好的索引:

索引也是17条,和数据库的数据是对应的,下面我把数据库中的其中两条数据的isdelet字段修改成1,然后创建一个增量索引,方法和昨天一样,我就不再截图了,首先还是修改数据库:

把发哥跟梁朝伟的isdelete修改成1,执行增量索引后的结果如下:

可以看到此时的索引少了2条,那到底少的是不是我变成1的两个人呢?我们可以查找一下,找不到的话就对了:

可以看到此时查找周润发,但是只找到了星爷,这个原因还是分词器的问题,昨天已经说过了,下面再查一下梁朝伟:

可以看到查找结果是空的。

  通过上面的两条查询,说明我们对假删除所做的增量索引时成功的。

二、定时增量索引

  如果每次数据库变化两条数据我们就得到http://localhost:8080/solr这里做一次增量索引,那不是很麻烦吗?所以SOLR提供了定时任务的功能,当然你也可以自己集成,比如用sPRing的定时任务,或者集成Quartz这些,定时执行一下增量索引的URL,也是可以达到相同的目的的,但是我们今天说的并不是这个,下面开始详细说。

  首先,需要引入一个JAR包,这个JAR包我已经发在了第一篇文章最后的DEMO里面了,解压之后就可以看到,但是我要说一点的是,我发出的JAR包是修改过源码的JAR包,很多地方给出的JAR包是apache-solr-dataimportscheduler-1.0.jar这个JAR包,下载地址是http://code.google.com/p/solr-dataimport-scheduler/downloads/list,但是这个jar包放入tomcat下的solr项目的lib包后会出错,其实也不是出错,而是出现下面的问题:

http请求一直返回415,提示不支持的媒体类型,这个问题上周六折腾了我一天的时间,快被郁闷死了,后来在网上查资料的时候看到了别人的一篇文章,也才得以解决,一会儿我会把那个文章地址也发出来,这是什么原因呢?原因就是这个jar包中的一个类在发送http请求时使用的是post方式,但是我们这里发送的请求却是get方式,所以才一直415,很蛋疼有没有,所以需要进入jar包,修改源码之后才能正常工作,我看的那篇文章地址是:http://blog.csdn.net/zwx19921215/article/details/43152307,里面讲的很详细,还有另外的一个问题,大家可以看一下,好了,把这个jar包引入solr的lib包之后进行下一步。

  第二步就是在solr的web.xml文件中添加如下代码:

  

  第三步,解压apache-solr-dataimportscheduler-1.0.jar文件,从解压出来的文件夹中找出dataimport.properties文件,然后复制该文件到你的SOLR_HOME目录下的conf文件夹中,

注意,这个conf文件夹并不是SOLR_HOME\collection1下的conf,而是SOLR_HOME\conf文件夹,以前是不存在的,需要你自己创建。 、

  第四步,打开dataimport.properties文件,修改该文件内容,修改后的文件内容如下所示:

  

#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################

#  to sync or not to sync
#  1 - active; anything else - inactive
syncEnabled=1

#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
syncCores=collection1

#  solr server name or ip address
#  [defaults to localhost if empty]
server=localhost

#  solr server port
#  [defaults to 80 if empty]
port=8080

#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr

#  URL params [mandatory]
#  remainder of URL
params=/dataimport?command=delta-import&clean=false&commit=true&wt=json&optimize=false 

#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
interval=1

#  重做索引的时间间隔,单位分钟,默认7200,即1天; 
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=7200

#  重做索引的参数
reBuildIndexParams=/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

  注意:

    1.syncCores=collection1表示对collection1这个core定时创建索引,如果不设置的话,默认也是对collection1创建索引,如果用到了multicore,那么使用逗号隔开即可。

    2.server=localhost,port=8080改成你自己的容器地址和端口号即可;

    3.interval=1表示定时增量索引的时间间隔,单位是分钟;

    4.其他的按照上面的注释配置即可,也没什么难理解的;

  OK,按照上面的配置之后,启动tomcat,过1分钟之后可以看到如下所示的信息,那么就是定时增量索引成功了:

  

 

  今天就到这里吧,写文档真的是件很耗费时间事,八点半开始写的,一写又一个小时了,暂时就这样了,明天就分词器吧,然后可能会加上multicore,但是也不一定,明天再说吧。