2017-02-03 4 views
0

У меня есть следующий solrj запрос:solrj запросов с ребенком родительского relationsship терпит неудачу

HttpSolrClient solr = new HttpSolrClient.Builder("http://10.xx.xxx.xxx:8983/solr").build(); 
    solr.setParser(new XMLResponseParser()); 
    SolrQuery query = new SolrQuery(); 
    query.set("q", "*:*"); 
    query.setFilterQueries("rt_tag:[2017-01-20T00:00:00Z TO NOW]","_relationship_:parent"); 
    query.setFields("[child parentFilter=\"_relationship_:parent\"]","rt_*");  
    QueryResponse response = solr.query("rtm_aggregations_shard1_replica1", query); 
    SolrDocumentList docList = response.getResults(); 

Когда я выполнить этот запрос, я получаю следующее сообщение об ошибке:

> ERROR SolrDispatchFilter null:java.lang.NullPointerException 
> null:java.lang.NullPointerException at 
> org.apache.solr.response.transform.ChildDocTransformer.transform(ChildDocTransformerFactory.java:137) 
> at 
> org.apache.solr.response.BinaryResponseWriter$Resolver.writeResultsBody(BinaryResponseWriter.java:159) 
> at 
> org.apache.solr.response.BinaryResponseWriter$Resolver.writeResults(BinaryResponseWriter.java:183) 
> at 
> org.apache.solr.response.BinaryResponseWriter$Resolver.resolve(BinaryResponseWriter.java:88) 
> at 
> org.apache.solr.common.util.JavaBinCodec.writeVal(JavaBinCodec.java:158) 
> at 
> org.apache.solr.common.util.JavaBinCodec.writeNamedList(JavaBinCodec.java:148) 
> at 
> org.apache.solr.common.util.JavaBinCodec.writeKnownType(JavaBinCodec.java:242) 
> at 
> org.apache.solr.common.util.JavaBinCodec.writeVal(JavaBinCodec.java:153) 
> at 
> org.apache.solr.common.util.JavaBinCodec.marshal(JavaBinCodec.java:96) 

Однако, выполнив соответствующий запрос per http напрямую работает нормально:

http://10.xx.xxx.xxx:8983/solr/rtm_aggregations_shard1_replica1/select?q=*:*&fq=rt_tag:[2017-01-20T00:00:00Z%20TO%20NOW]&fq=_relationship_:parent&fl=[child%20parentFilter=%22_relationship_:parent%22],rt_* 

Почему это не работает с solrj?

+0

Могу ли я спросить, какую версию Solr вы подключаете и какую версию Solrj вы используете? – freedev

+0

Я использую solrj 6.4.0 и solr 4.10.3 (из Cloudera 5.8.3). Может ли это объяснить проблемы? Должен ли я понизить solrj (я не могу обновить solr)? –

+0

Я добавил ответ, чтобы объяснить вашу проблему. – freedev

ответ

1

Вы не можете использовать клиента Solrj 6.4.0 с Solr 4.10.3.

Этот набор версий может объяснить проблемы, которые вы испытываете.

javabin is a custom binary format used to write out solr's response in a fast and efficient manner.

И, по моему опыту, я рекомендую использовать ту же точную версию Solrj.

В Solrj 4.10.3 это линия для создания клиента:

HttpSolrServer server = new HttpSolrServer("http://localhost:8983/solr/"); 

UPDATE

Как было предложено @ stefan.m проблема все еще возникают даже при работе с версией 4.10.4 ,

После проверки, глядя на source code, кажется, вы сталкиваетесь с ошибкой. Это строка 137 класса ChildDocTransformerFactory.java в версии Solr 4.x.

@Override 
public void transform(SolrDocument doc, int docid) { 

    FieldType idFt = idField.getType(); 
    Object parentIdField = doc.getFirstValue(idField.getName()); 

    // *** line 137 *** 
    String parentIdExt = parentIdField instanceof IndexableField 
    ? idFt.toExternal((IndexableField)parentIdField) 
    : parentIdField.toString(); 

Есть два варианта здесь, я имею в виду только idFt или parentIdField может быть null.

Я бы предложил попытаться добавить параметр fl к вашему запросу, добавив родительское поле идентификатора.

+0

Из-за некоторой проблемы с прокси-сервером я не смог скачать Solrj 4.10.3, но я тестировал версию 4.10.4. К сожалению, поведение в точности совпадает с поведением Solrj 6.4.0, то же самое происходит на сервере. –

+1

Очень странно. Я рассмотрю исходный код между 4.10.3 и более ранних версиях. – freedev

+0

@ stefan.m, вы можете написать мне, если бы вы попробовали? – freedev

0

Запрос, который отправляется в Solr является следующее:

http://10.xx.xxx.xxx:8983/solr/rtm_aggregations_shard1_replica1/select?q=*:*&fq=rt_tag:[2017-01-20T00:00:00Z%20TO%20NOW]&fq=_relationship_:parent&fl=[child%20parentFilter=%22_relationship_:parent%22],rt_*&wt=javabin 

Это один также не удается, но он будет работать при удалении части

&wt=javabin

Я не знаю причину , но обходной путь, чтобы сказать solrj использовать XMLResponseParser:

solr.setParser(new XMLResponseParser()); 

с помощью этой установки, это работает отлично.

Смежные вопросы