设为首页 收藏本站
查看: 1167|回复: 0

[经验分享] solr定时更新索引

[复制链接]

尚未签到

发表于 2017-12-18 15:37:35 | 显示全部楼层 |阅读模式
  注:在上一篇的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节点前面增加:
?<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 配置项说明
?##################################################                                              ##      dataimport scheduler properties         ##                                              ################################################## # to sync or not to sync# 1 - active; anything else - inactivesyncEnabled=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 deploymentsyncCores=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 URLparams=/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>  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的配置如下:
?<?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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425436-1-1.html 上篇帖子: Solr之Schema.xml配置 下篇帖子: Solr集群搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表