Java 当我从solr进行查询时,发生了一个常见的异常,告诉我未定义的字段userId

Java 当我从solr进行查询时,发生了一个常见的异常,告诉我未定义的字段userId,java,solr,Java,Solr,我正在开发一个web应用程序。 我使用SpringMVC框架、cassandra和solr。 我使用独立的solr,而不是solr云。 我使用solr作为全文检索工具。 我面临一个奇怪的问题,首先是schema.xml <schema name="KSP_core" version="1.1"> <types> <fieldType name="uuid" class="solr.UUIDField" indexed="true" />

我正在开发一个web应用程序。 我使用SpringMVC框架、cassandra和solr。 我使用独立的solr,而不是solr云。 我使用solr作为全文检索工具。 我面临一个奇怪的问题,首先是
schema.xml

<schema name="KSP_core" version="1.1">
  <types>
    <fieldType name="uuid" class="solr.UUIDField" indexed="true" />  
    <fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="int" class="solr.TrieIntField" precisionStep="0" positionIncrementGap="0"/>
    <fieldtype name="string"  class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
    <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" positionIncrementGap="0"/>
  <fieldType name="text_ik" class="solr.TextField"> 
    <analyzer type="index" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
    <analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/> 
    </fieldType>
  </types>

 <fields>   
  <!-- general -->
  <field name="id"        type="uuid"    indexed="true"  stored="true"  multiValued="false" required="true"/>
  <field name="dbTable"      type="string"    indexed="true"  stored="true"  multiValued="false" /> 
  <field name="userId"      type="string"    indexed="true"  stored="true"  multiValued="false" /> 
  <field name="originatorId"      type="string"    indexed="true"  stored="true"  multiValued="false" />
  <field name="associatedObjectId"      type="string"    indexed="true"  stored="true"  multiValued="false" /> 
  <field name="createTime"      type="date"      indexed="true"  stored="true"/>
  <field name="status"     type="int"    indexed="true"  stored="true"  multiValued="false" />
  <field name="postType"      type="string"    indexed="true"  stored="true"  multiValued="false" /> 

  <!-- user activity -->
  <field name="userOperate" type="string" indexed="true" stored="true" multiValued="false"/>


  <!--user reputation-->
  <field name="reputation" type="int"      indexed="true"  stored="true"/>
  <field name="dayTime"      type="string"    indexed="true"  stored="true"/> 
  <field name="reason"      type="string"    indexed="true"  stored="true"  multiValued="false" /> 

  <!--user tags-->
  <field name="tagId"      type="string"    indexed="true"  stored="true"  multiValued="false" /> 
  <field name="tagName"      type="string"    indexed="true"  stored="true"  multiValued="false" /> 

  <field name="reputationOnTag" type="int"      indexed="true"  stored="true"/>
  <field name="_version_" type="long" indexed="true" stored="true"/>
 </fields>

  <uniqueKey>id</uniqueKey>
 <!-- field for the QueryParser to use when an explicit fieldname is absent -->
 <defaultSearchField>userId</defaultSearchField>

 <!-- SolrQueryParser configuration: defaultOperator="AND|OR" -->
 <solrQueryParser defaultOperator="OR"/>
</schema>
以下代码是查询过程中的错误信息:

org.apache.solr.common.SolrException: undefined field userId
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:401)
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:181)
    at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:90)
    at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:301)
    at com.augmentum.ksp.solr.dao.impl.SolrBaseDaoImpl.query(SolrBaseDaoImpl.java:141)
    at com.augmentum.ksp.service.impl.TagStatsServiceImpl.getUserTagStats(TagStatsServiceImpl.java:50)
    at com.augmentum.ksp.controller.TagStatsController.getUserTagStats(TagStatsController.java:162)
    at sun.reflect.GeneratedMethodAccessor188.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.util.AssertionThreadLocalFilter.doFilter(AssertionThreadLocalFilter.java:54)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.util.HttpServletRequestWrapperFilter.doFilter(HttpServletRequestWrapperFilter.java:75)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:201)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.augmentum.iaphelper.filter.AuthenticationFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.augmentum.ksp.filter.I18nFilter.doFilter(I18nFilter.java:22)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)
从这些信息中,我只知道我的控制器、服务和dao工作正常。 非常奇怪的是,它在大多数时间都正常工作,但错误必须在我刷新JSP页面的20次内发生,这让我很担心。 我可以保证我的solr服务器正常启动。 和索引已加载。 我不知道如何找到解决办法,因为我不知道问题的根源

此外,还发生了许多类似以下的错误,这次不是名为userId的字段,而是名为dbTable的字段

org.apache.solr.common.SolrException: undefined field dbTable
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:401)
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:181)
    at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:90)
    at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:301)
    at com.augmentum.ksp.solr.dao.impl.SolrBaseDaoImpl.query(SolrBaseDaoImpl.java:135)
    at com.augmentum.ksp.service.impl.UserServiceImpl.listUserReputationByTime(UserServiceImpl.java:1222)
    at com.augmentum.ksp.controller.UserControler.listUserReputationByTime(UserControler.java:374)
    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.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.util.AssertionThreadLocalFilter.doFilter(AssertionThreadLocalFilter.java:54)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.util.HttpServletRequestWrapperFilter.doFilter(HttpServletRequestWrapperFilter.java:75)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:201)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.augmentum.iaphelper.filter.AuthenticationFilter.doFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jasig.cas.client.session.SingleSignOutFilter.doFilter(SingleSignOutFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.augmentum.ksp.filter.I18nFilter.doFilter(I18nFilter.java:22)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)

有人遇到过同样的问题吗?

如我所见,您可以在代码中更改baseUrl。正如您在评论中所说,您在同一页面上查询多个内核,并且所有内核都使用相同的
HttpSolrServer
。因此,您的解决方案中似乎缺少同步,可能有两个请求同时运行,一个请求查询另一个请求的“核心”

当然,您可以同步您的方法。但我认为,在您的情况下,最好不要每次都抽动
HttpSolrServer
,而是为查询设置附加参数,该参数将用作
baseUrl
的附加路径。您需要在创建时为
HttpSolrServer
设置一次
baseUrl

HttpSolrServer solrHttpServer = new HttpSolrServer(baseUrl);
您将设置参数(代码的差异),而不是为每个查询更改参数:


但最好的解决方案是为每个核心分别配备
HttpSolrServer

Map<String, HttpSolrServer> servers = new HashMap<String, HttpSolrServer>();
servers.put(coreName1, new HttpSolrServer(baseUrl + "/" + coreName1));
...

我编辑了这篇文章。我使用独立的solr。我使用不同的核心。每个核心都有自己的schema.xml您使用的是什么版本的Solr?我可以假设它是4.0,因为您使用的是LUCENE_40编解码器,但最好确定一下。如果可能的话,您能否将4.5 Solr和luceneMatchVersion更新为
4.5
<代码>和每个核心都有自己的模式。xml确保相关核心中确实有该字段(我知道,我知道,但可能您的代码在同一页查询多个核心,您在不同的核心中搜索问题)。是的,我使用的是solr 4.0。您是对的,我在同一页上查询了多个Core。您正在发布客户端stacktrace,可能还发布了solr内部记录的异常。嗨,我像您所说的那样更改了我的SolrbaseadoImpl.java文件。但是我收到了一个新错误:org.apache.solr.common.SolrException:服务器返回的非正常状态:404,消息:未找到。每次我进行查询时都会发生错误。URL是预期的URL。baserl是在solr.properties中定义的。我使用SpringMVC,属性文件加载到applicationContext.xml中,coreName是KSP_core。但是如果我不像您所说的那样更改代码,它可以工作,但是未定义的字段异常仍然很少发生。
HttpSolrServer solrHttpServer = new HttpSolrServer(baseUrl);
 String queryExpression = "*:*";
 String sortField = "createTime";
-String baseUrl = SolrUtil.getSolrBaseURL(solrHttpServer.getBaseURL());
-solrHttpServer.setBaseURL(baseUrl + "/" + coreName);
 SolrQuery query = new SolrQuery();
+query.set(CommonParams.QT, "/" + coreName + "/select");
 query.setQuery(queryExpression);
 query.setSortField(sortField, SolrQuery.ORDER.asc);
 QueryResponse rsp = solrHttpServer.query(query);
Map<String, HttpSolrServer> servers = new HashMap<String, HttpSolrServer>();
servers.put(coreName1, new HttpSolrServer(baseUrl + "/" + coreName1));
...
 String queryExpression = "*:*";
 String sortField = "createTime";
-String baseUrl = SolrUtil.getSolrBaseURL(solrHttpServer.getBaseURL());
-solrHttpServer.setBaseURL(baseUrl + "/" + coreName);
 SolrQuery query = new SolrQuery();
 query.setQuery(queryExpression);
 query.setSortField(sortField, SolrQuery.ORDER.asc);
-QueryResponse rsp = solrHttpServer.query(query);
+QueryResponse rsp = servers.get(coreName).query(query);