solr定时实时重建索引和增量更新
注:在上一篇的solr增量索引中遇到了一個很大的問題:定時任務一直無法執行,后來找了很多原因,分析日志后發現增量索引的請求都沒發送,又經過一番折騰才在網上找到了解決方法,是apache-solr-dataimportscheduler-1.0.jar的一個bug,post請求無法正確發送,這位仁兄的文章真是精華所在,感謝這位仁兄!
Solr Data Import Hander Scheduler 說明:?
?????? Solr官方提供了很強大的Data Import Request Handler,同時提供了一個簡單的?Scheduler,?
示例中的 Scheduler 只支持增量更新,不支持定期重做索引,因此我做了一個簡單的封裝,增加了重做索引的定時器.?
(原定時器作者是:Marko Bonaci, 在此表示感謝!)The original Scheduling source by Marko Bonaci, Thank him!?
使用說明?
?? 1. 將 apache-solr-dataimportscheduler-1.0.jar 和solr自帶的 apache-solr-dataimporthandler-.jar, apache-solr-dataimporthandler-extras-.jar 放到solr.war的lib目錄下面?
?? 2.修改solr.war中WEB-INF/web.xml, 在servlet節點前面增加:?
| 1 2 3 4 5 | <listener> ??????????<listener-class> ????????????????org.apache.solr.handler.dataimport.scheduler.ApplicationListener ??????????</listener-class> </listener> |
??? 4.重啟tomcat或者jboss 即可?
dataimport.properties 配置項說明
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | ################################################# #?????????????????????????????????????????????? # #?????? 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=core1,core2 #? 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] interval=1 #? 重做索引的時間間隔,單位分鐘,默認7200,即5天; #? 為空,為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 |
上文出處:http://code.google.com/p/solr-dataimport-scheduler/
博主ps:
如果你運行報以下異常:
org.apache.catalina.core.StandardContext listenerStart?
SEVERE: Exception sending context initialized event to listener instance of class org.apache.solr.handler.dataimport.scheduler.ApplicationListener?
java.lang.NullPointerException?
????at org.apache.solr.handler.dataimport.scheduler.ApplicationListener.contextInitialized(ApplicationListener.java:93)?
????at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4210)?
????at org.apache.catalina.core.StandardContext.start(StandardContext.java:4709)?
????at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)?
????at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)?
????at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:583)?
????at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1079)?
????at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:1002)?
????at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:506)?
????at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1317)?
????at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:324)?
????at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:142)?
????at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1065)?
????at org.apache.catalina.core.StandardHost.start(StandardHost.java:822)?
????at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)?
????at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)?
????at org.apache.catalina.core.StandardService.start(StandardService.java:525)?
????at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)?
????at org.apache.catalina.startup.Catalina.start(Catalina.java:595)?
????at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)?
????at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)?
????at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)?
????at java.lang.reflect.Method.invoke(Method.java:597)?
????at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)?
????at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
那說明你dataimport.properties的存放位置不正確,注意第3點,dataimport.properties存放在tomcat的solr.xml里配置的solr/home路徑的conf文件夾下,conf文件夾是沒有的,需新建。
例如solr.xml的配置如下:
| 1 2 3 4 | <?xmlversion="1.0"encoding="UTF-8"?> <ContextdocBase="E:\solrbase\tomcat7\webapps\solr"debug="0"crossContext="true"> ????<Environmentname="solr/home"type="java.lang.String"value="E:\solrbase\solr"override="true"/> </Context> |
則dataimport.properties位置是:E:\solrbase\solr\conf\dataimport.properties
dataimport.properties屬性文件param配置項示例:
例如:/deltaJob?command=delta-import&clean=false&commit=true& optimize=false&wt=json&indent=true&entity=companyJob&verbose=false&debug=false
上面鏈接根據實際solrconfig.xml和db-config.xml里配置文件里情況來定的。
發現兩個bug,一個是如果reBuildIndexBeginTime的值為空,則會導致interval強轉時報錯,另一個是請求solr服務器時返回的狀態碼永遠是415(對于當前請求的方法和所請求的資源,請求中提交的實體并不是服務器中所支持的格式,因此請求被拒絕。),
為什么了?
先看第一個bug,
看代碼:
??????????????????????????????????????????????????????????????????????? 圖1
這一塊代碼直接導致一下方法調用的時候報強轉錯,
??????????????????????????????????????????????????????????????????????? 圖2
這個方法對interval屬性進行了強轉
??????????????????????????????????????????????????????????????????????? 圖3
看如果reBuildIndexBeginTime為空時的設置的代碼:
???????????????????????????????????????????????????????????????????????? 圖4
以上紅框是更改后的格式,原格式只有“yyyy-MM-dd”部分,這樣會導致啟動的時候會不停地http請求solr服務器,因此需加“HH:mm:ss”,以此解決問題。
第一個bug解決方法把圖1中畫紅框的代碼去除就行了。
第二個bug,看代碼:
??????????????????????????????????????????????????????????????????????????????? 圖4
導致原因是HTTP以post請求,我們知道dataimport.properties的param是以get方式的鏈接,參數也包含在里面,程序未對此鏈接形式做處理封裝成post提交方式,所以導致請求solr失敗,把Http鏈接方式改成get就行了。
修復bug,重新打包后的jar下載:
solr-dataimportscheduler-1.1
solr-dataimportscheduler-1.1-source
dataimport.properties.zip
dataimport.properties.zip解壓到tomcat的solr.xml里配置的solr/home路徑,里面含有conf文件夾及dataimport.properties。
原jar下載:
apache-solr-dataimportscheduler-1.0.jar?
apache-solr-dataimportscheduler-1.0-with-source.jar
轉自:http://www.sxt.cn/u/756/blog/4231
總結
以上是生活随笔為你收集整理的solr定时实时重建索引和增量更新的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Win10菜单栏高度怎么修改 Win10
- 下一篇: jsp tag 自定义标签实现按钮的显示