Ok,我又來寫SOLR的內容了,昨天做了修改和增加的增量索引,今天來說說關於刪除的增量索引以及定時更新增量索引,廢話不多說,下面進入正文。
昨天已經說過,增量索引其實就是SOLR對上次做過(增量或者全量)索引之後到這次做索引之間的這段時間數據庫發生變化的數據進行創建索引,昨天我們說了增加一條數據或者修改一條數據之後創建增量索引,現在來說刪除數據的增量索引。
其實這裡所說的刪除是假刪除,什麼意思呢?就是並不是說在數據庫中把某些數據給徹底刪除掉,而是說給你不想創建索引的數據一個標識符,然後告訴solr,有這個標識符的數據你就不要給我創建索引了,我不需要,然後solr創建索引的時候就會忽視這些有特殊標識符的數據,大概的原理就是這樣的,那麼怎麼實現的呢?下面來看:
昨天做新增的增量索引的時候需要在數據庫添加一個字段,今天做刪除的,還是需要一個字段,然後用這個字段來標示數據是否需要創建索引,字段如下所示:
字段名稱大家可以自己看著定,類型給個int就行,至於長度也隨意,我的是0表示需要創建索引的數據,1表示不需要創建索引的數據,也就是我所說的假刪除的數據。
同樣,需要將該字段配置到data-config.xml和schema.xml文件中,如下所示:
data-config.xml
注意圈起來的三個地方,首先肯定是需要把isdelete字段變成一個file標簽,其次,需要query語句需要添加上where條件,查詢出數據庫中所有的需要創建索引的數據,然後再添加一個deletedPKQuery語句,這條語句和deltaQuery與deltaImportQuery語句一樣,都是只有在做增量索引的時候起作用,deletedPKQuery是查詢出所有假刪除的數據的ID,然後由deltaImportQuery查詢出這些ID對應的記錄的全部數據,然後在已經創建的索引中刪除掉這一部分索引。
schema.xml
schema.xml文件中倒是沒有什麼大的變化,只需要把isdelete字段添加進來即可:
按照上面的配置即可,然後我們來看一下效果,首先是數據庫:
還是昨天的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,但是也不一定,明天再說吧。