標籤:
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 - inactivesyncEnabled=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 deploymentsyncCores=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 URLparams=/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,但是也不一定,明天再說吧。
SOLR增量索引--刪除業務、定時增量索引