Apache spark solr v6+;中org.apache.solr.client.solrj.util.ClientUtils.toSolrInputDocument()方法的替换;?

Apache spark solr v6+;中org.apache.solr.client.solrj.util.ClientUtils.toSolrInputDocument()方法的替换;?,apache-spark,solr,Apache Spark,Solr,由于方法org.apache.solr.client.solrj.util.ClientUtils.toSolrInputDocument()在solr 6中被删除,现在将SolrDocument转换为SolrInputDocument的替代品是什么?为什么要做这种改变 编辑-1:在@MatsLindh回答之后(不起作用): 1 List sds=MyUtil.getMySolrDocs(); 2个用于(解决方案文档sd:sds){ 3 SolrDocumentBase sdb=sd; 4 So

由于方法org.apache.solr.client.solrj.util.ClientUtils.toSolrInputDocument()在solr 6中被删除,现在将SolrDocument转换为SolrInputDocument的替代品是什么?为什么要做这种改变

编辑-1:在@MatsLindh回答之后(不起作用):

1 List sds=MyUtil.getMySolrDocs();
2个用于(解决方案文档sd:sds){
3 SolrDocumentBase sdb=sd;
4 SolrInputDocument sid=(SolrInputDocument)sdb;
5.System.out.println(“文档id:+sid.get(“id”));
6系统输出打印项次(“文件标题:+sid.get(“标题”);
7.
8 }

在6.x中,它们都共享相同的抽象父类,
SolrDocumentBase
,因此要在它们之间进行转换,您应该能够在必要时通过父类在类之间使用强制转换


最重要的是它们都包含几乎相同的功能,因此没有两个类做几乎相同的事情,什么都不共享,该功能被移动到一个父类,该父类保留常用方法和属性,并让实现子类为这些用例执行特定工作。

正确的方法由Solrj 5.2.1中的源代码演示:

public static SolrInputDocument toSolrInputDocument(SolrDocument d) {
  SolrInputDocument doc = new SolrInputDocument();

  for (String name : d.getFieldNames()) {
    doc.addField(name, d.getFieldValue(name));
  }

  return doc;
}

如上所示,您可以通过复制字段从SolrDocument创建SolrInputDocument;不要忘记也复制子文档(用于块连接查询),例如:

    public static SolrInputDocument toSolrInputDocument(SolrDocument solrDocument) {
        SolrInputDocument solrInputDocument = new SolrInputDocument();

        for (String name : solrDocument.getFieldNames()) {
            solrInputDocument.addField(name, solrDocument.getFieldValue(name));
        }

        //Don't forget children documents
        if(solrDocument.getChildDocuments() != null) {
            for(SolrDocument childDocument : solrDocument.getChildDocuments()) {
                //You can add paranoic check against infinite loop childDocument == solrDocument
                solrInputDocument.addChildDocument(toSolrInputDocument(childDocument));
            }
        }
        return solrInputDocument; 
    }

嗨,Mats,谢谢你的回答。我试图强制转换对象,但在第4行出现“java.lang.ClassCastException:org.apache.solr.common.SolrDocument无法强制转换为org.apache.solr.common.SolrInputDocument”错误,请参阅我的EDIT-1获取代码。可以在两个子类之间强制转换吗?任何帮助都将被感激。好的观点-向下投射可能不会起作用。但是SolrDocumentBase实现了
Map
,SolrInputDocument将
SolrInputDocument(映射字段)
作为构造函数。您是否尝试过新的SolrInputDocument(sd)?好的,我尝试将第4行替换为“SolrInputDocument sid=new SolrInputDocument(sdb);”,现在第5行出现错误-“java.lang.ClassCastException:java.lang.String不能强制转换为org.apache.solr.common.SolrInputField”,即使我尝试了“sid.getFieldValue(“id”)(也不起作用)。在尝试“sid.get(new SolrInputField(“id”)”)时,我得到的所有id都为NULL。我猜sd到sid的转换没有正常进行。你怎么想?这意味着我们需要在解决方案文档和每个文档中循环所有字段。事实上,我在寻找更好的方法。感谢您的回答。这将只处理solr中的“存储”字段。如果有未存储的字段,我建议使用原始源对文档重新编制索引。
    public static SolrInputDocument toSolrInputDocument(SolrDocument solrDocument) {
        SolrInputDocument solrInputDocument = new SolrInputDocument();

        for (String name : solrDocument.getFieldNames()) {
            solrInputDocument.addField(name, solrDocument.getFieldValue(name));
        }

        //Don't forget children documents
        if(solrDocument.getChildDocuments() != null) {
            for(SolrDocument childDocument : solrDocument.getChildDocuments()) {
                //You can add paranoic check against infinite loop childDocument == solrDocument
                solrInputDocument.addChildDocument(toSolrInputDocument(childDocument));
            }
        }
        return solrInputDocument; 
    }