solr之定时增量索引实现

 solr本身就提供了一个工具库实现定时增量索引,但是我在使用的过程中发现会出现一些问题,目前遇到两点:

    1.启动时总是报如下异常:

?
1
The web application [solr] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

尝试修改源码,不通过SolrResourceLoader加载配置文件,修改完成部署后,可以正常启动。

    2.正常启动后,定时发起任务时,报如下异常:

?
1
415  Unsupported Media Type

查看BaseTimerTask类,发现在发送http请求的地方,没有在请求头中加入Content-Type。修改之后问题解决。

    代码具体修改如下,完整源码会在最后提供下载地址:

ApplicationListener类:

?
1
2
3
4
5
6
7
8
9
10
@Override
public  void  contextInitialized(ServletContextEvent servletContextEvent) {
     ...
     Timer timer =  new  Timer();
     HttpPostScheduler task =  new  HttpPostScheduler(
     servletContext.getServletContextName(),
     servletContext.getInitParameter( "autoDeltaImportConfPath" ), 
         timer);
     ...    
}

SolrDataImportProperties类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
...
private  String autoDeltaImportConfPath;
 
public  SolrDataImportProperties() {
}
 
public  SolrDataImportProperties(String autoDeltaImportConfPath) {
     this .autoDeltaImportConfPath = autoDeltaImportConfPath;
}
...
public  void  loadProperties( boolean  force) {
     try  {
         if  (force || properties ==  null ) {
             properties =  new  Properties();
 
             File dataImportProperties =  new  File(autoDeltaImportConfPath,
                                 "dataimport.properties" );
     ...
}

HttpPostScheduler类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public  HttpPostScheduler(String webAppName, String autoDeltaImportConfPath, Timer t)  throws  Exception{
...
     //load properties from global dataimport.properties
     p =  new  SolrDataImportProperties(autoDeltaImportConfPath);
...             
}
...
private  void  sendHttpPost(String completeUrl, String coreName){
...    
     URL url =  new  URL(completeUrl);
     HttpURLConnection conn = (HttpURLConnection)url.openConnection();
 
     conn.setRequestMethod( "POST" );
     conn.setRequestProperty( "type" "submit" );
     conn.setRequestProperty( "Content-Type" "*/*" );     //新增
     conn.setDoOutput( true );
...
}

web.xml文件:

?
1
2
3
4
5
6
7
< context-param >
     < param-name >autoDeltaImportConfPath</ param-name >
     < param-value >/yourconfpath</ param-value >
</ context-param >
< listener >
     < listener-class >org.apache.solr.handler.dataimport.scheduler.ApplicationListener</ listener-class >
</ listener >

另外说明一点,现在的dataimport.properties可以随意放,只需在上面指定位置即可。

源码托管在Git osc了,地址是http://git.oschina.net/ywooer/solr-dataimporthandler-scheduler.git

    参考文档:

官方文档,http://wiki.apache.org/solr/DataImportHandler#Scheduling

官方工具库:http://code.google.com/p/solr-data-import-scheduler/

另外有一个第三方实现支持重建索引:https://code.google.com/p/solr-dataimport-scheduler/

你可能感兴趣的:(Solr)