solr定时实时重建索引和增量更新

当前位置:

solr定时实时重建索引和增量更新

作者:邓华锋于2014-3-4发布在 分类:solr / 阅读32820 次 / 共有18条评论  

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节点前面增加:
 <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) 目录下面

“haha”同学说此路径可自定义的,在web.xml里配置如下:

<context-param>
    <param-name>autoDeltaImportConfPath</param-name>
    <param-value>/yourconfpath</param-value>
</context-param> 
则,你的dataimport.properties可放在yourconfpath路径里。



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=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文件夹是没有的,需新建,也可自定义,具体看上面的第3条。

例如solr.xml的配置如下:


<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="E:solrbasetomcat7webappssolr" debug="0" crossContext="true">
	<Environment name="solr/home" type="java.lang.String" value="E:solrbasesolr" override="true" />
</Context> 



dataimport.properties位置是:E:solrbasesolrconfdataimport.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


  • 标签: solr 定时 重建索引 增量更新
  • 该日志于 2014-3-4 18:53 由 邓华锋 发表在 邓华锋 上,你除了可以发表评论外,还可以转载"solr定时实时重建索引和增量更新"日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!
  • 版权所有:《邓华锋》 => 《solr定时实时重建索引和增量更新
    本文地址:http://dhf.ink/post-242.html
    除非注明,文章均为 《邓华锋》 原创,欢迎转载!转载请注明本文地址,谢谢。

评论:

  1. 王祝贺于2017-11-23 10:36说: 回复

    你好,大神,请问按照你写的这样,咱们还用在data-config.xml中写相关的sql吗?

    • 邓华锋于2017-11-24 13:35说: 回复

      @王祝贺:要呀 这个只是个定时发送请求给solr的程序  solr和要建索引关联表的关联关系是需要提前配置好的

  2. daelly于2016-06-01 10:46说: 回复

    可以,415的问题给满分

  3. haha于2014-10-17 16:35说: 回复

    其实dataimport.properties 随便放哪都行,只要在web.xml里加载下就OK,
    <context-param>
        <param-name>autoDeltaImportConfPath</param-name>
        <param-value>/yourconfpath</param-value>
    </context-param>

    • 邓华锋于2014-10-17 16:51说: 回复

      @haha:恩恩 这都被你发现了 ( ^_^ )不错嘛!我这就把你说的加入文章中。

  4. 鲁宁于2014-07-08 16:14说: 回复

    您好!我现在就是在做这个定时实时索引,按照您的步骤,但是home下没有config文件啊,刚接触solr可以加一下您的qq吗,我的QQ:375049016

    • 邓华锋于2014-07-08 18:58说: 回复

      @鲁宁:solr home下是没有conf文件夹,需要自己创建个呀,然后把dataimport.properties放进去就成了。

  5. 洋葱头于2014-04-16 14:39说: 回复

    不好意思,是这样,我不是JAVA开发人员,所以不太懂,您上传的源码我已经部署到了ECLIPSE,但我不会跟踪代码运行是否有问题呢,您有联系的的方式吗?能加一下您的QQ吗?

    • 风吹鸡蛋壳儿于2014-05-06 20:41说: 回复

      @洋葱头:我也遇到同样的问题,请问你解决了吗?

  6. 洋葱头于2014-04-15 20:34说: 回复

    是不是我没有配置 data_config.xml的问题呢,因为现在用的是,HBASE数据库,在SOLR里,不会配置HBASE类型的数据源呢

    • 邓华锋于2014-04-16 09:29说: 回复

      @洋葱头:看异常是你启动是的solr定时程序错误

  7. 洋葱头于2014-04-15 20:21说: 回复

    dataimport.properties  这个配置文件应该送到那个文件夹里呢?

    • 邓华锋于2014-04-16 09:27说: 回复

      @洋葱头:放在solr目录的conf文件夹下  conf没有 你新建一个

  8. 洋葱头于2014-04-15 13:45说: 回复

    你好,我用的是SOLR+HBASE方式进行分布式的搜索HBASE数据,但用上面的方法进行配置后,我的SOLR就打不开了了,报404错,是不是我的配置有问题呢?能跟您联系一下吗?我的QQ:109154127  ,我的邮箱:109154127@qq.com
    我的  dataimport.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=hadoop2,hadoop3//这是另两台分布式结构中的从机,主机是hadoop1

    #  solr server name or IP address
    #  [defaults to localhost if empty]
    server=hadoop1//我的分布式主机,是不是这里设置的有问题呢?

    #  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=/select?qt=/dataimport&command=delta-import&clean=false&commit=true//这里我也没有进行改动

    #  schedule interval
    #  number of minutes between two runs
    #  [defaults to 30 if empty]
    interval=1

    #  重做索引的时间间隔,单位分钟,默认7200,即1天;
    #  为空,为0,或者注释掉:表示永不重做索引
    #reBuildIndexInterval=2//这里我注视掉了

    #  重做索引的参数
    reBuildIndexParams=/select?qt=/dataimport&command=full-import&clean=true&commit=true//这里我也没有进行改动

    #  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
    #  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期
    reBuildIndexBeginTime=22:00:00//这里我只改了时间

    • 邓华锋于2014-04-15 13:57说: 回复

      @洋葱头:是你的server=hadoop1 这里配置错误了,这里一般配solr的服务地址,
      比如你访问本地的solr地址是http://localhost:8983/solr,则拆分对应配置项
      server=localhost
      port=8983
      webapp=solr
      如果是http://localhost:8983/
      则webapp的配置设为空:
      webapp=

      你重新配置下你的server试试

      • 洋葱头于2014-04-15 19:57说: 回复

        @邓华锋:可能不仅仅是这个问题,我查了一下tomcat 的日志
        Apr 15, 2014 7:47:47 PM org.apache.catalina.core.ApplicationContext log
        INFO: SessionListener: contextDestroyed()
        Apr 15, 2014 7:47:47 PM org.apache.catalina.core.ApplicationContext log
        INFO: ContextListener: contextDestroyed()
        Apr 15, 2014 7:47:54 PM org.apache.catalina.core.ApplicationContext log
        INFO: ContextListener: contextInitialized()
        Apr 15, 2014 7:47:54 PM org.apache.catalina.core.ApplicationContext log
        INFO: SessionListener: contextInitialized()
        Apr 15, 2014 7:47:54 PM 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)

        • 邓华锋于2014-04-16 09:33说: 回复

          @洋葱头:你用的是我改过之后的程序吗  如果是我把源码放上来 到时候你跟踪下代码  看哪个对象为空了  在进行方法调用的时候抛异常了