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 >

     3.將apache-solr-dataimportscheduler-.jar 中 dataimport.properties 取出並根據實際情況修改,然后放到 solr.home/conf (不是solr.home/core/conf) 目錄下面 
    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
<? xml version = "1.0" encoding = "UTF-8" ?>
< Context docBase = "E:\solrbase\tomcat7\webapps\solr" debug = "0" crossContext = "true" >
     < Environment name = "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,

看代碼:

QQ截圖20140307100358.png

                                                                        圖1

這一塊代碼直接導致一下方法調用的時候報強轉錯,

QQ截圖20140307101559.png

                                                                        圖2

這個方法對interval屬性進行了強轉

QQ截圖20140307101901.png

                                                                        圖3

看如果reBuildIndexBeginTime為空時的設置的代碼:

QQ截圖20140309224036.png

                                                                         圖4

以上紅框是更改后的格式,原格式只有“yyyy-MM-dd”部分,這樣會導致啟動的時候會不停地http請求solr服務器,因此需加“HH:mm:ss”,以此解決問題。

第一個bug解決方法把圖1中畫紅框的代碼去除就行了。

第二個bug,看代碼:

QQ截圖20140307183708.png

                                                                                圖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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM