今天早晨启动本地搭建的SolrCloud时,发现tomcat报了一个错误,但是即使报错Tomcat还是可以启动,SolrCloud也能正常工作,但是绝不能容忍集群启动时会出现error的我,必须得搞定这个问题,指不定哪天就悲剧了,这个错误不会造成SolrCloud无法使用,但是会影响到SolrCloud的ping功能,点ping的时候会变成感叹号,不能使用,所以还是得解决滴,先把这个异常亮个相:
12863 [searcherExecutor-7-thread-1] ERROR org.apache.solr.core.SolrCore – org.apache.solr.common.SolrException: undefined field text at org.apache.solr.schema.IndexSchema.getDynamicFieldType(IndexSchema.java:1269) at org.apache.solr.schema.IndexSchema$SolrQueryAnalyzer.getWrappedAnalyzer(IndexSchema.java:434) at org.apache.lucene.analysis.DelegatingAnalyzerWrapper$DelegatingReuseStrategy.getReusableComponents(DelegatingAnalyzerWrapper.java:74) at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:175) at org.apache.lucene.util.QueryBuilder.createFieldQuery(QueryBuilder.java:207) at org.apache.solr.parser.SolrQueryParserBase.newFieldQuery(SolrQueryParserBase.java:374) at org.apache.solr.parser.SolrQueryParserBase.getFieldQuery(SolrQueryParserBase.java:742) at org.apache.solr.parser.SolrQueryParserBase.handleBareTokenQuery(SolrQueryParserBase.java:541) at org.apache.solr.parser.QueryParser.Term(QueryParser.java:299) at org.apache.solr.parser.QueryParser.Clause(QueryParser.java:185) at org.apache.solr.parser.QueryParser.Query(QueryParser.java:107) at org.apache.solr.parser.QueryParser.TopLevelQuery(QueryParser.java:96) at org.apache.solr.parser.SolrQueryParserBase.parse(SolrQueryParserBase.java:151) at org.apache.solr.search.LuceneQParser.parse(LuceneQParser.java:50) at org.apache.solr.search.QParser.getQuery(QParser.java:141) at org.apache.solr.handler.component.QueryComponent.prepare(QueryComponent.java:147) at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:197) at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135) at org.apache.solr.core.SolrCore.execute(SolrCore.java:1976) at org.apache.solr.core.QuerySenderListener.newSearcher(QuerySenderListener.java:64) at org.apache.solr.core.SolrCore$5.call(SolrCore.java:1748) at java.util.concurrent.FutureTask.run(FutureTask.java:262) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:745)
发现这个异常是undefined field text,有一个字段未定义,那么肯定是配置文件的问题,打开/root/solrcloud/configs/schema.xml,查找我定义的字段名称和字段属性,没发现有text这个字段呢?然后继续打开solrconfig.xml,发现有六处出现text,那么显然这两个配置文件肯定是导致这个错误的原因,于是去看了下这两个配置文件的含义,发现schema.xml中有一项是defaultSearchField,这个的值是text,然后就明白了,这里有个默认的搜索字段,如果什么都不选择,默认按照手机号搜索,那么既然这个报错了,那就改成其他的吧,这里我随便改了个字段:
<defaultSearchField>mobile</defaultSearchField>
然后在对应的solrconfig.xml中,修改如下:
<requestHandler name="/select" class="solr.SearchHandler"> <!-- default values for query parameters can be specified, these will be overridden by parameters in the request --> <lst name="defaults"> <str name="echoParams">explicit</str> <int name="rows">10</int> <str name="df">mobile</str> </lst> </requestHandler>
优先级:”/admin/ping”中的”df”属性 > “/select”中的”df”属性 > defaultSearchField
“/admin/ping”中不配置”df”属性的话,就使用”/select”的”df”属性,即text字段,而text在schema.xml文件中未定义,导致出现异常。
修改完成后,上传并覆盖原来的配置文件:
java -classpath .:/root/solrcloud/solr-lib/* org.apache.solr.cloud.ZkCLI -cmd upconfig -zkhost 192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181 -confdir /root/solrcloud/configs/PCLoginLog/ -confname pcloginlog
Reload一下SolrCloud的collection:
curl 'http://192.168.1.4:8080/solr/admin/collections?action=RELOAD&name=pcloginlog'
然后重新启动tomcat,发现不抱错了,而且Ping功能也能正常使用了。
未经允许不得转载:李阳博客 » 启动SolrCloud时出现SolrException,并且Ping功能不能使用的解决方案