2012-12-19 65 views
4

我正在尝试使用SolrJ查询基于this question中提供的代码的Solr数据库,但它一直抛出空指针异常。使用SolrJ查询Solr服务器

我的代码是:

@PUT 
@Produces(MediaType.TEXT_PLAIN) 
public String returnText(String url) throws MalformedURLException, SolrServerException{ 
    SolrServer server = new HttpSolrServer("http://localhost:8080/apache-solr-1.4.0"); 

    ModifiableSolrParams params = new ModifiableSolrParams(); 
    params.set("?q", "*:*"); 
    params.set("facet", true); 
    params.set("rows", 5); 

    QueryResponse response = server.query(params); 
    System.out.println(response); 
    return "success"; 
} 

,如果我跑这个网址:在我的浏览器http://localhost:8080/apache-solr-1.4.0/select/?q=*:*&facet=true&rows=5那么,如果我进入然而返回正确的值:http://localhost:8080/apache-solr-1.4.0/select/q=*:*&facet=true&rows=5然后我得到确切同样的错误,当我运行在Eclipse中,错误的是:

19/12/2012 1:09:01 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException 
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container 
org.apache.solr.client.solrj.SolrServerException: Server at http://localhost:8080/apache-solr-1.4.0 returned non ok status:500, message:null java.lang.NullPointerException at java.io.StringReader.<init>(StringReader.java:33) at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:197) at org.apache.solr.search.LuceneQParser.parse(LuceneQParserPlugin.java:78) at org.apache.solr.search.QParser.getQuery(QParser.java:131) at org.apache.solr.handler.component.QueryComponent.prepare(QueryComponent.java:89)  at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:174) at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:131) at org.apache.solr.core.SolrCore.execute(SolrCore.java:1316) at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:338) at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:241)  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)  at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)  at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69)  at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619) 
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:328) 
    at org.apache.solr.client.solrj.impl.HttpSolrServer.request(HttpSolrServer.java:211) 
    at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:89) 
    at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:311) 
    at geoportal.webservice.download.returnText(download.java:48) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    ....... 

如果我我的代码更改为params.set("q","*:*");然后我得到这个错误:

19/12/2012 1:13:30 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException 
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container 
org.apache.solr.client.solrj.SolrServerException: Error executing query 
    at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:95) 
    at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:311) 
    at geoportal.webservice.download.returnText(download.java:48) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     ....... 

关于我做错了什么想法?

感谢堆

编辑

这是基于我对solrQuery新代码关闭this

@PUT 
@Produces(MediaType.TEXT_PLAIN) 
public String returnText(String url) throws MalformedURLException, SolrServerException{ 
    SolrServer server = new HttpSolrServer("http://localhost:8080/apache-solr-1.4.0"); 
    SolrQuery query = new SolrQuery(); 

    query.setQuery("*:*"); 
    query.setFacet(true); 
    query.set("wt", "json"); 
    query.setRows(5); 
    query.setStart(0); 

    QueryResponse response = server.query(query); 

    System.out.println(response); 
    return "success"; 
} 

但它仍然无法正常工作:( 控制台输出:

19/12/2012 2:24:33 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException 
SEVERE: The exception contained within MappableContainerException could not be mapped to a response, re-throwing to the HTTP container 
org.apache.solr.client.solrj.SolrServerException: Error executing query 
    at org.apache.solr.client.solrj.request.QueryRequest.process(QueryRequest.java:95) 
    at org.apache.solr.client.solrj.SolrServer.query(SolrServer.java:311) 
    at geoportal.webservice.download.returnText(download.java:39) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      ...... 

编辑

我在我的代码放在一个System.out.println(query.toString());,它输出:

q=*%3A*&facet=true&wt=json&rows=5&start=0 

如果我进入我的浏览器这就像

http://localhost:8080/apache-solr-1.4.0/select/q=*%3A*&facet=true&wt=json&rows=5&start=0 

然后再次抛出一个空指针异常。但是,如果我在q=*%3A*...前面手动输入?,那么它就可以工作。所以我认为我的solr服务器需要这个?(这是因为它太旧了吗?),有什么办法可以用硬编码吗?

感谢

回答

3

尝试使用SolrQuery对象,而不是ModifiableSolrParams。也许它会有所帮助。

如果您不能使用SolrQuery以任何理由,请尝试使用静态的名称,如“CommonParams.Q”而不是硬编码的像“?Q”

EDITED

我测试你的问题,我想你在您的应用服务器上缺少配置。

您使用的是JBoss 7.1吗?您需要添加一行到.standalone.sh或standalone.bat,告诉solr在哪里。例如,在Jboss 7.1中,在默认配置中,您必须将\“ - Dsolr.solr.home = $ SOLR_HOME/example/solr \”\添加到standalone.sh

我不知道其他应用程序服务器,但你可以搜索一下,看看你如何在另一个AS中做到这一点。

+0

感谢您指出我到SolrQuery。不幸的是它仍然无法正常工作,我用我的新代码编辑了我的问题。你能看到什么可能是错的?感谢堆 – Pete

+0

是“QueryResponse response = server.query(params);”对?你的新变量被称为“查询” –

+0

啊是的,它应该说'QueryResponse response = server.query(query);'。我现在要改变这个问题 – Pete

0

您可能没有相同版本的Solr和SolrJ。

你可能会做出一个糟糕的决定,通过使用这样一个古老的Solr版本。

您无法检查Solr日志以找出500来自哪里。

您正在使用ModifiableSolrParams代替SolrQuery。

2

尝试使用SolrQuery,你有选项来设置一切都像查询,过滤器,面,启动,行等。下面是一个示例代码

最新的Solr 6.2.1您可以创建Solr的客户端象下面这样:

SolrClient solr = new HttpSolrClient.Builder("<url>").build(); 

SolrQuery query = new SolrQuery(); 
query.setQuery("collector:" + input); 
query.addFilterQuery("(doc_type:" + entity + ")"); 
query.addSort("lastUpdatedAt", ORDER.desc); 
query.setFacet(true); 
query.setStart(pagenumber); 
query.setRows(pagesize); 
QueryResponse response = solr.query(query); 
0

正如之前的意见建议尝试使用SolrQuery。 这里是链接,可以帮助solrj example

我想你错过response.getResults(); 这将返回一个SolrDocumentList它可以处理使用迭代和遍历结果 喜欢:

SolrDocumentList docs = response.getResults(); 

Iterator<SolrDocument> iter = docs.iterator(); 
while (iter.hasNext()) 
{ 
// handle results 
}