在solr v6 +中替换org.apache.solr.client.solrj.util.ClientUtils.toSolrInputDocument()方法?

时间:2016-07-08 12:28:19

标签: apache-spark solr

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

EDIT-1: @MatsLindh回答后(不起作用):

1 List<SolrDocument> sds = MyUtil.getMySolrDocs();
2 for(SolrDocument sd : sds){
3        SolrDocumentBase sdb =  sd;
4        SolrInputDocument sid = (SolrInputDocument)sdb;
5        System.out.println("Docs id : "+sid.get("id"));
6        System.out.println("Docs title : "+sid.get("title"));
7        
8 }

3 个答案:

答案 0 :(得分:2)

Solrj 5.2.1中ClientUtils.toSolrInputDocument的源代码证明了这样做的正确方法:

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

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

  return doc;
}

答案 1 :(得分:2)

如上所示,您可以通过复制字段从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; 
    }

答案 2 :(得分:-1)

在6.x中,它们共享相同的抽象父类select salary from employee join mytable on empid = id. ,因此要在它们之间进行转换,您应该能够在必要时通过父类在类之间使用强制转换。

reason for the change是它们都包含几乎相同,相同的功能,所以不是让两个类几乎完全相同而且没有共享,而是将功能转移到保留常用方法的父类。属性,让实现子类为这些用例执行特定的工作。