Запрос сервера Solr с использованием SolrJ

Я пытаюсь запросить свою базу данных solr на основе кода, предоставленного в этом вопросе с помощью SolrJ, но он продолжает создание исключения нулевого указателя.

Мой код:

@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";
}

и если я запускаю этот URL: 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, основанный на этом:

@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 нужен этот ? (это потому, что он такой старый?), есть ли способ жестко запрограммировать его?

Спасибо


person Pete    schedule 19.12.2012    source источник


Ответы (4)


Попробуйте использовать SolrQuery объект вместо ModifiedSolrParams. Может быть, это поможет.

Если вы не можете использовать SolrQuery по какой-либо причине, попробуйте использовать статические имена, такие как «CommonParams.Q», вместо жестко заданных, таких как «?q».

ОТРЕДАКТИРОВАНО

Я проверил вашу проблему и думаю, что вам не хватает конфигураций на вашем сервере приложений.

Вы используете JBoss 7.1? Вам нужно добавить строку в .standalone.sh или standalone.bat, сообщающую, где находится solr. Например, в Jboss 7.1 в конфигурациях по умолчанию необходимо добавить \"-Dsolr.solr.home=$SOLR_HOME/example/solr\" \ в файл standalone.sh

Я не знаю о других серверах приложений, но вы можете немного поискать и посмотреть, как вы можете сделать это в другой AS.

person Felipe Fonseca    schedule 19.12.2012
comment
Спасибо, что указали мне на SolrQuery. К сожалению, он все еще не работает, я отредактировал свой вопрос выше с помощью моего нового кода. Вы можете увидеть, что может быть не так? Большое спасибо - person Pete; 19.12.2012
comment
Ответ QueryResponse = server.query(params); правильно? Ваша новая переменная называется запросом - person Felipe Fonseca; 19.12.2012
comment
Ах да, это должно сказать QueryResponse response = server.query(query);. сейчас изменю вопрос - person Pete; 19.12.2012

Попробуйте использовать 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);
person Deepak Shrivastava    schedule 06.10.2016

Возможно, у вас не одна и та же версия Solr и SolrJ.

Возможно, вы примете неправильное решение, если вообще будете использовать такую ​​древнюю версию Solr.

Вы не можете проверить журнал Solr, чтобы узнать, откуда берется 500.

Вы используете ModifiedSolrParams вместо SolrQuery.

person bmargulies    schedule 19.12.2012

Как следует из предыдущих комментариев, попробуйте использовать SolrQuery. Вот ссылка, которая может помочь пример solrj

Я думаю, вам не хватает response.getResults();, это вернет SolrDocumentList, который вы можете обработать с помощью Iterator и прокрутить результаты, например:

SolrDocumentList docs = response.getResults();

Iterator<SolrDocument> iter = docs.iterator();
while (iter.hasNext())
{
// handle results
}
person Mohammad Osama    schedule 16.08.2017