Java 具有子-父关系ship的solrj查询失败

Java 具有子-父关系ship的solrj查询失败,java,solr,solr4,Java,Solr,Solr4,我有以下solrj查询: 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

我有以下solrj查询:

    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)
但是,直接按照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?

发送到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());

有了此设置,就可以正常工作。

您不能将Solrj 6.4.0客户端与Solr 4.10.3一起使用

这个版本可以解释你所经历的麻烦

javabin是一种自定义二进制格式,用于在 快速有效的方式

根据我的经验,我建议使用与Solrj完全相同的版本

在Solrj 4.10.3中,这是创建客户机的一行:

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

正如@stefan.m所建议的,即使使用版本4.10.4,问题仍然会出现

在查看之后,您似乎面临着一个bug。 这是Solr 4.x版本中ChildDoctTransformerFactory.java类的第137行

@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
参数,添加父Id字段。

请问您连接的是哪个版本的Solr,您使用的是哪个版本的Solrj?我使用的是Solrj 6.4.0和Solr 4.10.3(来自Cloudera 5.8.3)。这能解释问题吗?我应该降级solrj吗(我不能升级solr)?我已经添加了一个答案来解释您的问题。由于代理问题,我无法下载solrj 4.10.3,但我使用版本4.10.4进行了测试。不幸的是,这种行为与Solrj 6.4.0完全相同,同样的错误发生在服务器上。非常奇怪。我将看一看4.10.3和早期版本之间的源代码。我对SOLR不是很精通。“父Id”字段是什么意思?