由于在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 }
答案 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是它们都包含几乎相同,相同的功能,所以不是让两个类几乎完全相同而且没有共享,而是将功能转移到保留常用方法的父类。属性,让实现子类为这些用例执行特定的工作。