今天用到solr定時重建索引和增量更新技術,就從網上搜了一些資料,在這里給大家整理了一下,也經過了自己的測試,沒有異常。
Solr官方提供了很強大的Data Import Request Handler,同時提供了一個簡單的 Scheduler,示例中的 Scheduler 只支持增量更新,不支持定期重做索引,因此我做了一個簡單的封裝,增加了重做索引的定時器。
1. 將 apache-solr-dataimportscheduler-1.0.jar 和solr自帶的 solr-dataimporthandler-4.7.1.jar、 solr-dataimporthandler-extras-4.7.1.jar 放到tomcat發布的webapps/solr/WEB-INF/lib目錄下面(或者放到solr.war的lib目錄下面)。
2.修改tomcat發布的webapps/solr/WEB-INF/web.xml(或者修改solr.war中WEB-INF/web.xml), 在servlet節點前面增加:
<listener> <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class> </listener>
3.將apache-solr-dataimportscheduler-1.0-source.jar 中 dataimport.properties 取出並根據實際情況修改,然后放到 solr.home/conf (不是solr.home/core/conf) 目錄下面,conf這個目錄不存在,需要自己手動創建該目錄即可。
4.重啟tomcat或者jboss 即可。
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=core0,core1 # 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 # schedule interval # number of minutes between two runs # [defaults to 30 if empty] # 增量索引的時間間隔,單位分鍾 # 為空,為0,或者注釋掉:表示永不增量索引 interval=1 # 重做索引的時間間隔,單位分鍾,默認7200,即5天; # 為空,為0,或者注釋掉:表示永不重做索引 reBuildIndexInterval=2 # 重做索引的參數 reBuildIndexParams=/dataimport?command=full-import&clean=false&commit=true # 重做索引時間間隔的計時開始時間,第一次真正執行的時間=reBuildIndexBeginTime+reBuildIndexInterval*60*1000; # 兩種格式:2012-04-11 03:10:00 或者 03:10:00,后一種會自動補全日期部分為服務啟動時的日期 reBuildIndexBeginTime=03:10:00
對於以上配置,發現兩個bug,一個是如果reBuildIndexBeginTime的值為空,則會導致interval強轉時報錯,另一個是請求solr服務器時返回的狀態碼永遠是415(對於當前請求的方法和所請求的資源,請求中提交的實體並不是服務器中所支持的格式,因此請求被拒絕。)
1、第一個bug
這一塊代碼直接導致一下方法調用的時候報強轉錯,
這個方法對interval屬性進行了強轉,
看如果reBuildIndexBeginTime為空時的設置的代碼:
以上紅框是更改后的格式,原格式只有“yyyy-MM-dd”部分,這樣會導致啟動的時候會不停地http請求solr服務器,因此需加“HH:mm:ss”,以此解決問題。
第一個bug解決方法把圖1中畫紅框的代碼去除就行了。
2、第二個bug
導致原因是HTTP以post請求,我們知道dataimport.properties的param是以get方式的鏈接,參數也包含在里面,程序未對此鏈接形式做處理封裝成post提交方式,所以導致請求solr失敗,把Http鏈接方式改成get就行了。
關於上面提到apache-solr-dataimportscheduler-1.0.jar和apache-solr-dataimportscheduler-1.0-source.jar的原jar包和重新打包的在以下地址中