这两天给客户部署独立的solr服务器遇到的错误,现在总结一下。

1. org.apache.solr.client.solrj.SolrServerException: Error executing query

具体的错误信息如下:

  1. org.apache.solr.client.solrj.SolrServerException: Error executing query
  2. at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:100)
  3. at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:301)
  4. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  5. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  6. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  7. at java.lang.reflect.Method.invoke(Method.java:606)
  8. at ognl.OgnlRuntime.invokeMethod(OgnlRuntime.java:897)
  9. at ognl.OgnlRuntime.callAppropriateMethod(OgnlRuntime.java:1299)
  10. at ognl.ObjectMethodAccessor.callMethod(ObjectMethodAccessor.java:68)
  11. at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethodWithDebugInfo(XWorkMethodAccessor.java:117)
  12. at com.opensymphony.xwork2.ognl.accessor.XWorkMethodAccessor.callMethod(XWorkMethodAccessor.java:108)
  13. at ognl.OgnlRuntime.callMethod(OgnlRuntime.java:1375)
  14. at ognl.ASTMethod.getValueBody(ASTMethod.java:91)
  15. at ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)
  16. at ognl.SimpleNode.getValue(SimpleNode.java:258)
  17. at ognl.Ognl.getValue(Ognl.java:470)
  18. at ognl.Ognl.getValue(Ognl.java:434)
  19. at com.opensymphony.xwork2.ognl.OgnlUtil$3.execute(OgnlUtil.java:398)
  20. at com.opensymphony.xwork2.ognl.OgnlUtil.compileAndExecuteMethod(OgnlUtil.java:450)
  21. at com.opensymphony.xwork2.ognl.OgnlUtil.callMethod(OgnlUtil.java:396)
  22. at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:430)
  23. at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:290)
  24. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:251)
  25. at com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor.intercept(AnnotationWorkflowInterceptor.java:135)
  26. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  27. at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
  28. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  29. at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:229)
  30. at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
  31. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  32. at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104)
  33. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  34. at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
  35. at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
  36. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  37. at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
  38. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  39. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  40. at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:245)
  41. at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
  42. at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:575)
  43. at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81)
  44. at org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter.doFilter(StrutsExecuteFilter.java:93)
  45. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  46. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  47. at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter.doFilter(StrutsPrepareFilter.java:91)
  48. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  49. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  50. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  51. at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
  52. at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
  53. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  54. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  55. at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
  56. at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
  57. at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
  58. at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:394)
  59. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  60. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  61. at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
  62. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  63. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  64. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  65. at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
  66. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  67. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  68. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  69. at com.svorx.core.web.filter.NoCacheFilter.doFilterInternal(NoCacheFilter.java:48)
  70. at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
  71. at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
  72. at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
  73. at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
  74. at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
  75. at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
  76. at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
  77. at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
  78. at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
  79. at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
  80. at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1083)
  81. at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)
  82. at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
  83. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  84. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  85. at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
  86. at java.lang.Thread.run(Thread.java:745)
  87. Caused by: org.apache.http.ParseException: Invalid content type:
  88. at org.apache.http.entity.ContentType.parse(ContentType.java:233)
  89. at org.apache.solr.client.solrj.impl.HttpSolrServer.executeMethod(HttpSolrServer.java:496)
  90. at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:210)
  91. at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:206)
  92. at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:91)
  93. ... 90 more

  原因:GET向solr传递参数的时候参数过长导致的。如下方法,solrServer是 org.apache.solr.client.solrj.impl.HttpSolrServer 实例

  1. // 执行查询
  2. QueryResponse response = solrServer.query(solrQuery);

  解决办法:改为POST提交

  1. SolrServer solrServer = new HttpSolrServer("xx");
  2. SolrQuery solrQuery = new SolrQuery();
  3. solrServer.query(solrQuery, METHOD.POST);

2.  拼接的条件过多,导致出现    too many boolean clauses

解决办法: 修改solr配置
配置文件位置:SOLRHOME/CORE_NAME/conf/solrconfig.xml

找到如下配置:

<maxBooleanClauses>1024</maxBooleanClauses>

1024 改为10240

其中,SOLRHOME为你的solr主目录,CORENAME为你的core的名称

3. solr增加索引之后没有立即生效

可能的原因是:虽然代码中调用server.add(doc)了,但是没有进行commit,所以solr不会立即更新索引

解决办法:增加完索引之后,进行commit。不要add一个就commit一次,太耗性能了,最好是批量add完成之后一次性commit。

  1. solrServer.commit();

  这种提交叫硬提交(hard commit), 使用这种提交会把文档立即持久化到磁盘,并可以让你能立马查询到它,因为它会开启一个新的searcher,但是它缺点很明显,就是很耗性能,并会阻塞到提交任务完成,使用它是非常昂贵的操作。 查看solrj的源码发现commit()方法的实现是commit(true,true);及waitFlush=true 和 waitSearcher=true。

源码如下:

  1. /**
  2. * Performs an explicit commit, causing pending documents to be committed for indexing
  3. * <p>
  4. * waitFlush=true and waitSearcher=true to be inline with the defaults for plain HTTP access
  5. * @throws IOException If there is a low-level I/O error.
  6. */
  7. public UpdateResponse commit( ) throws SolrServerException, IOException {
  8. return commit(true, true);
  9. }

  上面手动commit太耗性能了,也可以用solr的配置自动提交,自动提交程序只需要server.add(doc),无需commit()。

  一般也是自动提交结合手动commit来实现,比如你想删除索引批量重建就可以删除之后手动commit,然后批量建立索引之后再手动commit;如果是单个文档添加索引就可以使用solr的自动提交。

  在collection/conf/solrconfig.xml配置文件的updateHandler节点,提供了autoCommit和autoSoftCommit两种提交索引的方式。

  1. <!-- AutoCommit
  2.  
  3. Perform a hard commit automatically under certain conditions.
  4. Instead of enabling autoCommit, consider using "commitWithin"
  5. when adding documents.
  6.  
  7. http://wiki.apache.org/solr/UpdateXmlMessages
  8.  
  9. maxDocs - Maximum number of documents to add since the last
  10. commit before automatically triggering a new commit.
  11.  
  12. maxTime - Maximum amount of time in ms that is allowed to pass
  13. since a document was added before automatically
  14. triggering a new commit.
  15. openSearcher - if false, the commit causes recent index changes
  16. to be flushed to stable storage, but does not cause a new
  17. searcher to be opened to make those changes visible.
  18.  
  19. If the updateLog is enabled, then it's highly recommended to
  20. have some sort of hard autoCommit to limit the log size.
  21. -->
  22. <autoCommit>
  23. <maxTime>${solr.autoCommit.maxTime:15000}</maxTime>
  24. <openSearcher>false</openSearcher>
  25. </autoCommit>
  26.  
  27. <!-- softAutoCommit is like autoCommit except it causes a
  28. 'soft' commit which only ensures that changes are visible
  29. but does not ensure that data is synced to disk. This is
  30. faster and more near-realtime friendly than a hard commit.
  31. -->
  32.  
  33. <autoSoftCommit>
  34. <maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>
  35. </autoSoftCommit>

解释:

autoCommit 硬提交
  maxDocs:add到solr缓冲区的文档数量超过这个值时,自动执行commit把结果写入到磁盘索引文件中
  maxTime:最长多久执行一次commit,即如果文档一直没有通过commit沉淀到磁盘上,那么持久性就可能出问题,所以要隔一段时间就执行一次commit
  openSearcher:要不要新开一个searcher,如果要新开,那么目前已有的cache就会失效,具体代码可以看SolrIndexSearcher,它里面有几个Cache成员变量,如果你新建立一个searcher那么cache失效也是正常的了,除非你有autoWarming机制。在hard commit的时候设置openSearcher=false,那么执行完hard commit之后,磁盘文件虽然改变了,但是searcher没有新开,需要reload或者重启,才能看到索引中的新文档。

一般硬提交配置如下:

  1. <autoCommit>
  2. <maxTime>${solr.autoCommit.maxTime:60000}</maxTime>
  3. <openSearcher>true</openSearcher>
  4. </autoCommit>

autoSoftCommit 软提交
  自动软提交只确保改变的索引是可见的,但不保证数据会同步到磁盘。该提交方式比应提交来说更快,更接近实时,就是所谓的支持near real-time (NRT) searching近实时查询。如果不想执行autoSoftCommit(autoSoftCommit的maxTime设置成-1)。

  软提交可以根据需求决定是否开启。

solr常见错误的更多相关文章

  1. 初识JAVA(二)(送给Java和安卓初学者)----常见错误

    博主接着上篇的来讲哦,以后的更新中,博主会出一些练习题,有兴趣的可以做做然后吧代码粘贴到下面,大家可以一起研究学习,一起进步,本篇文章主要讲的是: 一.常见错误 二.连接上篇一起的训练 无论是什么方向 ...

  2. ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock

    ubuntu 常见错误--Could not get lock /var/lib/dpkg/lock 通过终端安装程序sudo apt-get install xxx时出错:E: Could not ...

  3. coreseek常见错误原因及解决方法

    coreseek常见错误原因及解决方法 Coreseek 中文全文检索引擎 Coreseek 是一款中文全文检索/搜索软件,以GPLv2许可协议开源发布,基于Sphinx研发并独立发布,专攻中文搜索和 ...

  4. Android Fragment使用(二) 嵌套Fragments (Nested Fragments) 的使用及常见错误

    嵌套Fragment的使用及常见错误 嵌套Fragments (Nested Fragments), 是在Fragment内部又添加Fragment. 使用时, 主要要依靠宿主Fragment的 ge ...

  5. C语言初学者代码中的常见错误与瑕疵(23)

    见:C语言初学者代码中的常见错误与瑕疵(23)

  6. struts2.5框架使用通配符指定方法常见错误

    struts2.5框架使用通配符指定方法(常见错误) 在学习struts框架时经常会使用到通配符调用方法,如下: <package name="shop" namespace ...

  7. .Net常见错误

    常见错误 #1: 把引用当做值来用,或者反过来 C++ 和其他很多语言的程序员,习惯了给变量赋值的时候,要么赋单纯的值,要么是现有对象的引用.然而,在C# 中,是值还是引用,是由写这个对象的程序员决定 ...

  8. WCF项目中出现常见错误的解决方法:基础连接已经关闭: 连接被意外关闭

    在我们开发WCF项目的时候,常常会碰到一些莫名其妙的错误,有时候如果根据它的错误提示信息,一般很难定位到具体的问题所在,而由于WCF服务的特殊性,调试起来也不是那么方便,因此往往会花费不少时间来进行跟 ...

  9. Python程序的常见错误(收集篇)

    关于Python Python是一门解释性的,面向对象的,并具有动态语义的高级编程语言.它高级的内置数据结构,结合其动态类型和动态绑定的特性,使得它在快速应用程序开发(Rapid Applicatio ...

随机推荐

  1. 【maven】父子项目的一般姿势

    一.为什么需要创建maven父子项目. 一般一个业务较多的项目,如果我们做服务拆分的话,有些公共的模块就只能做成jar包了.你将util.constant.model封装成jar包是比较好的,如果da ...

  2. mvc 返回json格式时间格式化

    protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEnco ...

  3. element-ui MessageBox组件源码分析整理笔记(十二)

    MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...

  4. ios开发的技巧

    http://www.cocoachina.com/ios/20141231/10783.html

  5. Java打印9*9乘法表

    废话不多说直接贴代码, 先放一个标准的正三角形状的 for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System ...

  6. Linux上安装git

    Linux上安装git Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理. 而国外的GitHub和国内的Coding都是项目的托管平台.但是在使用Git工具的时候 ...

  7. 1-22Python练习题1-1

      Python¶   (一)四个数字:1.2.3.4,组成多少个互不相同且无重复数字的三位数?各是多少? In [1]: b=[] for i in range(1,5): for j in ran ...

  8. Python语言基础04-构造程序逻辑

    本文收录在Python从入门到精通系列文章系列 学完前面的几个章节后,博主觉得有必要在这里带大家做一些练习来巩固之前所学的知识,虽然迄今为止我们学习的内容只是Python的冰山一角,但是这些内容已经足 ...

  9. Codeforces Round #304 (Div. 2)(CF546E) Soldier and Traveling(最大流)

    题意 给定 n 个城市,m 条边.人只能从走相邻边相连(只能走一次)的城市. 现在给你初始城市的每一个人数,再给一组每个城市人数.询问是否可以从当前人数变换到给定人数.如果能,输入"YES& ...

  10. Win平台下窗口操作(Unity)

    Unity发布在Win平台时, 可以通过user32.dll的方式与Win API通信, 最小化窗口代码: public static class DllImports { private const ...