【发布时间】:2013-04-16 14:56:28
【问题描述】:
我的客户端应用程序找到了我的 Solr 4.2.1 服务器,并且似乎能够索引文档。我还没有写任何查询代码。但是当我访问我的 Solr Admin 后台时,当我点击查询时,我得到以下异常:
Apr 16, 2013 4:55:31 PM org.apache.solr.core.SolrCore execute
INFO: [1050] webapp=/viparis-solr-server path=/admin/file params={file=/usr/local/tomcat7/webapps/viparis-solr-server/Proto/solr/common/fr/schema.xml&contentType=text/xml;charset%3Dutf-8} status=500 QTime=27
Apr 16, 2013 4:55:31 PM org.apache.solr.common.SolrException log
SEVERE: null:java.lang.NullPointerException
at org.apache.solr.handler.admin.ShowFileRequestHandler.showFromFileSystem(ShowFileRequestHandler.java:212)
at org.apache.solr.handler.admin.ShowFileRequestHandler.handleRequestBody(ShowFileRequestHandler.java:122)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1816)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:448)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:269)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
事实上,文件/usr/local/tomcat7/webapps/viparis-solr-server/Proto/solr/common/fr/schema.xml是存在的,并且Tomcat服务器有读取权限来访问它。此路径在 solr.xml 中定义为核心配置的一部分。
有什么想法吗?
编辑: 根据 Arkain 的建议,这是我的 schema.xml 的一部分。这实际上是我从另一个正常工作的 Solr 服务器获取它后唯一更改的部分,所以问题可能出在此处:
<field name="TYPE" type="string" indexed="true" stored="true"/>
<field name="id_manifestation" type="string" indexed="true" stored="true"/>
<field name="nom" type="string" indexed="true" stored="true" omitNorms="false"/>
<field name="nomFr" type="text_full" indexed="false" stored="true"/>
<field name="nomEn" type="text_full" indexed="false" stored="true"/>
<field name="theme" type="string" indexed="false" stored="true" multiValued="true"/>
<field name="descriptionEn" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="descriptionFr" type="string" indexed="true" stored="true" multiValued="true"/>
<field name="motsCleEn" type="text_full" indexed="true" stored="true" multiValued="true"/>
<field name="motsCleFr" type="text_full" indexed="true" stored="true" multiValued="true"/>
<field name="dateDebut" type="date" indexed="true" stored="true"/>
<field name="dateFin" type="date" indexed="true" stored="true"/>
<field name="url" type="string" indexed="false" stored="true"/>
<field name="logo" type="string" indexed="false" stored="true"/>
编辑: 这是我的 solrconfig.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!--
This is a stripped down config file used for a simple example...
It is *not* a good example to work from.
-->
<config>
<luceneMatchVersion>LUCENE_41</luceneMatchVersion>
<!-- The DirectoryFactory to use for indexes.
solr.StandardDirectoryFactory, the default, is filesystem based.
solr.RAMDirectoryFactory is memory based, not persistent, and doesn't work with replication. -->
<directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
<dataDir>${solr.core1.data.dir:}</dataDir>
<updateHandler class="solr.DirectUpdateHandler2">
<!-- <updateLog> -->
<!-- <str name="dir">${solr.core1.data.dir:}</str> -->
<!-- </updateLog> -->
</updateHandler>
<!-- realtime get handler, guaranteed to return the latest stored fields
of any document, without the need to commit or open a new searcher. The current
implementation relies on the updateLog feature being enabled. -->
<requestHandler name="/get" class="solr.RealTimeGetHandler">
<lst name="defaults">
<str name="omitHeader">true</str>
</lst>
</requestHandler>
<requestHandler name="/replication" class="solr.ReplicationHandler" startup="lazy" />
<requestDispatcher handleSelect="true" >
<requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" formdataUploadLimitInKB="2048" />
</requestDispatcher>
<requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
<requestHandler name="/analysis/field" startup="lazy" class="solr.FieldAnalysisRequestHandler" />
<requestHandler name="/update" class="solr.UpdateRequestHandler" />
<requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" />
<requestHandler name="/admin/ping" class="solr.PingRequestHandler">
<lst name="invariants">
<str name="q">solrpingquery</str>
</lst>
<lst name="defaults">
<str name="echoParams">all</str>
</lst>
</requestHandler>
<!-- multi-colored tag FragmentsBuilder -->
<!-- <fragmentsBuilder name="colored" class="org.apache.solr.highlight.ScoreOrderFragmentsBuilder"> -->
<!-- <lst name="defaults"> -->
<!-- <str name="hl.tag.pre"><![CDATA[ -->
<!-- <b style="background:yellow">,<b style="background:lawgreen">, -->
<!-- <b style="background:aquamarine">,<b style="background:magenta">, -->
<!-- <b style="background:palegreen">,<b style="background:coral">, -->
<!-- <b style="background:wheat">,<b style="background:khaki">, -->
<!-- <b style="background:lime">,<b style="background:deepskyblue">]]></str> -->
<!-- <str name="hl.tag.post"><![CDATA[</b>]]></str> -->
<!-- </lst> -->
<!-- </fragmentsBuilder> -->
<!-- Spell Check
The spell check component can return a list of alternative spelling
suggestions.
http://wiki.apache.org/solr/SpellCheckComponent
-->
<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
<str name="queryAnalyzerFieldType">textSpell</str>
<lst name="spellchecker">
<str name="name">default</str>
<str name="field">textng</str>
<str name="spellcheckIndexDir">spellchecker</str>
<str name="classname">solr.IndexBasedSpellChecker</str>
<str name="buildOnCommit">true</str>
<str name="comparatorClass">score</str>
</lst>
<!--<lst name="spellchecker">-->
<!-- <str name="name">suggest</str>-->
<!-- <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>-->
<!-- <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>-->
<!-- -->
<!-- <str name="field">textng</str> the indexed field to derive suggestions from -->
<!-- <float name="threshold">0.005</float>-->
<!-- <str name="buildOnCommit">true</str>-->
<!--</lst>-->
</searchComponent>
<!-- A request handler for demonstrating the spellcheck component.
NOTE: This is purely as an example. The whole purpose of the
SpellCheckComponent is to hook it into the request handler that
handles your normal user queries so that a separate request is
not needed to get suggestions.
IN OTHER WORDS, THERE IS REALLY GOOD CHANCE THE SETUP BELOW IS
NOT WHAT YOU WANT FOR YOUR PRODUCTION SYSTEM!
See http://wiki.apache.org/solr/SpellCheckComponent for details
on the request parameters.
-->
<requestHandler name="/spell" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="df">textng</str>
<str name="spellcheck.dictionary">default</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.extendedResults">true</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.count">10</str>
<str name="spellcheck.maxCollations">10</str>
<str name="spellcheck.maxCollationTries">10</str>
<str name="spellcheck.collateExtendedResults">true</str>
<str name="spellcheck">true</str>
<str name="defType">edismax</str>
<str name="rows">100</str>
<str name="fl">*,score</str>
<str name="qf">textng^100</str>
<str name="sort">TYPE asc, score desc</str>
<str name="pf">textng^100</str>
<double name="typeboost">1.0</double>
<str name="debugQuery">false</str>
<str name="facet">on</str>
<str name="facet.field">nom_manifestation</str>
<str name="facet.limit">-1</str>
<str name="hl.highlightMultiTerm">true</str>
<str name="hl.fragsize">200</str>
<str name="hl.snippets">200</str>
<!-- <str name="hl.fragmentsBuilder">colored</str> -->
<!-- <str name="hl.fragListBuilder">simple</str> -->
<str name="hl.fl">*</str>
<str name="hl.usePhraseHighlighter">true</str>
<str name="hl">true</str>
</lst>
<arr name="first-components">
<str>spellcheck</str>
</arr>
</requestHandler>
<requestHandler name="/selectItem" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
<str name="df">nom</str>
<str name="rows">100</str>
<str name="fl">*,score</str>
<str name="qf">nom^100</str>
<str name="sort">TYPE asc, score desc</str>
<double name="typeboost">1.0</double>
<str name="debugQuery">false</str>
</lst>
</requestHandler>
<requestHandler name="/store" class="solr.SearchHandler"
startup="lazy">
<lst name="defaults">
<str name="df">nom</str>
<str name="spellcheck.onlyMorePopular">false</str>
<str name="spellcheck.extendedResults">true</str>
<str name="spellcheck.collate">true</str>
<str name="spellcheck.count">1</str>
<str name="spellcheck">true</str>
<str name="defType">edismax</str>
<str name="rows">100</str>
<str name="sort">score desc</str>
<double name="typeboost">1.0</double>
<str name="debugQuery">false</str>
<str name="qf">nom^100 textphon^50</str>
<str name="facet">on</str>
<str name="facet.field">nom_manifestation</str>
<str name="facet.limit">-1</str>
<str name="hl.highlightMultiTerm">true</str>
<str name="hl.fragsize">200</str>
<str name="hl.snippets">200</str>
<!-- <str name="hl.fragmentsBuilder">colored</str> -->
<!-- <str name="hl.fragListBuilder">simple</str> -->
<str name="hl.fl">*</str>
<str name="hl.usePhraseHighlighter">true</str>
<str name="hl">true</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
<searchComponent class="solr.SpellCheckComponent" name="suggest">
<lst name="spellchecker">
<str name="name">suggest</str>
<str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
<str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
<!-- Alternatives to lookupImpl:
org.apache.solr.spelling.suggest.fst.FSTLookup [finite state automaton]
org.apache.solr.spelling.suggest.fst.WFSTLookupFactory [weighted finite state automaton]
org.apache.solr.spelling.suggest.jaspell.JaspellLookup [default, jaspell-based]
org.apache.solr.spelling.suggest.tst.TSTLookup [ternary trees]
-->
<str name="field">textng</str> <!-- the indexed field to derive suggestions from -->
<float name="threshold">0.005</float>
<!--str name="buildOnCommit">true</str-->
<!--
<str name="sourceLocation">american-english</str>
-->
</lst>
</searchComponent>
<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
<lst name="defaults">
<str name="spellcheck">true</str>
<str name="spellcheck.dictionary">suggest</str>
<str name="spellcheck.onlyMorePopular">true</str>
<str name="spellcheck.count">5</str>
<str name="spellcheck.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
<!-- config for the admin interface -->
<admin>
<defaultQuery>solr</defaultQuery>
</admin>
</config>
【问题讨论】:
-
它似乎可以找到该文件,这是一个错误代码 500,这通常是(在 http 世界中)服务器错误。也许 schema.xml 中有错误导致它在初始化期间失败
-
@arkain:好主意!我在问题中添加了一段我的 schema.xml...
-
我没有看到任何明显的语法错误。仔细检查所有类型是否定义正确。确保没有 xml 错误。如果一切都失败了,请尝试将架构更改为仅包含字符串类型或其他内容的单个字段,并删除所有未使用的
FieldTypes,以减少可能出错的地方的数量。 -
我真正不明白的是索引似乎工作,当我启动我的服务器时,我看到服务器加载了不同的核心,带有模式,这对我来说似乎很好。但是在管理控制台中我得到了一个例外。奇怪...
-
Tomcat服务器启动时没有错误。