Java 具有子-父关系ship的solrj查询失败
我有以下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
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”字段是什么意思?