SOLR增量索引

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

  昨天写了SOLR服务的部署和全量索引的建立,今天继续说一下SOLR增量索引的问题,什么是增量索引呢?就是不必对数据库中的全部数据全部做索引,而是仅仅对上次创建索引到当前时间之间数据库数据发生的变化,对发生变化 的这部分数据创建索引,并且上次创建的索引并不发生变化。创建增量索引的对象包括数据库在这段时间之间新增的数据或者修改的数据或者假删除的数据,下面先说对增加或者修改的数据创建增量索引;

  首先,在我的F:\SOLR_HOME\collection1\conf文件夹中有一个dataimport.PRoperties文件,打开该文件可以看到如下信息:

在这可以看到last_index_time属性,显示的时间是昨天下午的三点二十七分二十三秒,也就是说我上次创建索引的时间是2015-10-18 15\:27\:23,我们先记着这个时间,再看一下数据库的数据:

表数据创建的时间也是昨天下午的,那么怎么配置才能让你在数据库增加数据之后,这些数据自动添加到你的索引里面而不用对数据库中的所有数据重新创建索引呢?下面就是见证奇迹的时刻。

  一、数据库表添加timestamp类型字段

  在数据库表中添加UpdateTime字段,当然这个名字你可以随便起,没有什么影响,这个字段的类型是timestamp,可以给一个默认值是CURRENT_TIMESTAMP(这是MySQL的,Oracle可能需要改变,我不熟悉ORACLE,所以你懂的)。

  二、修改data-config.xml文件

  

  如图所示,把你在数据库中添加的字段添加到对应的<entity></entity>中间。并且在query语句的下面添加两条语句,分别是deltaImportQuerydeltaQuery,这两条语句是专门为了增量索引存在的,再deltaQuery语句中last_index_time是不是很熟悉,这个就是开始时候让大家看到的dataimport.properties中的数据,deltaQuery语句就是查询出来上次创建索引之后数据库发生变化的数据当然这里是不包含删除的,关于删除的事下次再说,这次的demo里面没有做,所以下片文章里面再说)的ID,注意deltaQuery语句返回的仅仅是发生变化的数据的ID,deltaImportQuery语句则是根据deltaQuery语句返回的ID查询出这些记录的全部内容,注意deltaImportQuery="select * from tuser where UserID='${dih.delta.UserID}'",这里大家一定要注意一下,我刚开始写的时候这里没注意随便写了,后来找了好久才找到问题。

  三、修改schema.xml文件

  

  同样将该字段添加到schame.xml文件中,注意名字要和data-config.xml中的对应。

  四、确认JAR文件

  昨天做全量索引的时候已经把这两个jar文件放到了D:\apache-tomcat-7.0.63\webapps\solr\WEB-INF\lib文件夹下面了,做数据导入这两个jar必不可少,所以我还是再说一下比较好。等下做定时增量导入的时候还需要另外一个jar文件,到时候再说。

  五、数据库添加数据

  下面我就在数据库中新增几条数据,如下所示:

一共增加了三条数据,为了区别上面的古人,我添加了三条现代人,大家对付着看吧。

  六、启动Tomcat,访问solr页面

  启动tomcat后,访问localhost:8080/solr,进入collection1,点击Dataimport按钮,进入如下页面:

这个页面是做数据导入,但是我还是先进入一下Query页面,先查询一下当前的索引有多少条,好区分我们的增量索引,这里出现了一点比较蛋疼的事,我的例子配置好了定时增量索引,时间还是一分钟,我这边写了一会文字,那边就给我更新好了,我把tomcat停了,然后改了一下定时的时间,只好重新来了,先给大家看一下现在的索引:

数据库我添加完数据之后就是15条数据,现在的索引也是15条,这是对应的,下面我重新再数据库中添加几条数据,然后重新创建增量索引:

数据库我把发哥跟朝伟也给加上了,现在是17条数据,下面进入solr的页面,点击Dataimport,command中选择delta-import,如下所示:

把下面的clean前面的对号点掉,不然会把前面创建的索引清楚掉,然后点击Execute按钮,执行完成后如下所示:

此时去Query页面查询如下:

可以发现此时索引数据变成了17条,说明我们的增量索引好使了,有人会说你的索引数是变了,但是谁知道我发哥你给加进来了吗?OK,下面我们查询一下发哥的索引,查询方法如下:

我发哥是不是出来了呢?当然有人又说了,你发哥出来了,可是不是还有个周星驰吗?他也改名周润发了,这个。。这个,这个是solr的分词器的问题,solr自带的分词器对中文的支持程度是有限的,说起来分词器,我今天也是被这分词器搞的很蛋疼,具体的等说道分词器的时候再说吧,现在我没有自己配置分词器,大家可以看一下下面的页面就知道什么情况了:

solr的分词器把周润发分词成为了"周"、"润"、"发"三个字,索引查的时候会把包含这三个字的内容都给查出来,索引查发哥的时候才把星爷也给搞出来了,这个实非我之过也。

  本来想把定时增量索引也给写了,但是还得去看EasyUI的教程,所以明天再写吧,明天把删除的增量索引还有定时一起给写了,还有分词器,应该就是这三个内容,后天可能会写solrJ操作索引,其实也就是CRUD,我会的暂时也就是这些了,对了,还有一个multicore,但是这个我暂时没有做例子,我先做个例子,如果可以再给大家写出来,其他的以后用到了再说吧。

  恩,暂时就这样,有说的不对的地方欢迎大家指正。