2016-06-07 35 views
3

我有一個Bean類活動,它將配置文件列表和用戶Bean關聯起來。現在,如果我試圖通過SOLRJ在Solr中插入這個Activity bean,它會給我空指針異常。 例外的是下面這段代碼造成的:如何在SolrJ中插入有許多子Bean的Bean對象

public <T> boolean insert (T bean) { 
    try { 
     UpdateResponse response = solrClient.addBean(bean); 
     System.out.println("insert bean ElapsedTime: " + response.getElapsedTime()); 
     solrClient.commit(); 
     return true; 
    } catch (IOException | SolrServerException e) { 
     e.printStackTrace(); 
    } 
    return false; 
} 

回答

2

通過使用SolrInputDocument類我能夠插入文件,其中包含多個嵌套的文件,即使addBeans法(以下SolrJ代碼)也做相同。因此,我必須爲我的每個bean構建索引的SolrInputDocument對象。它是唯一的解決方案嗎?

 public UpdateResponse addBeans(String collection, Collection<?> beans, int commitWithinMs) throws SolrServerException, IOException { 
    DocumentObjectBinder binder = this.getBinder(); 
    ArrayList<SolrInputDocument> docs = new ArrayList<>(beans.size()); 
    for (Object bean : beans) { 
     docs.add(binder.toSolrInputDocument(bean)); 
    } 
    return add(collection, docs, commitWithinMs); 
    } 
3

如果您正在使用Solr6並獲得空指針異常則是指: SOLRJ-6.0.0: Insertion of a bean object which associate list of bean object is giving null pointer exception

然而,如果你試圖插入,然後嵌套豆關聯,它會給你除外豆:clazz.getName() + " cannot have more than one Field with child=true"

這將是由下面的片的DocumentObjectBinder類SolrJ的代碼:

@SuppressForbidden(reason = "Needs access to possibly private @Field annotated fields/methods") 
    private List<DocField> collectInfo(Class clazz) { 
    List<DocField> fields = new ArrayList<>(); 
    Class superClazz = clazz; 
    List<AccessibleObject> members = new ArrayList<>(); 

    while (superClazz != null && superClazz != Object.class) { 
     members.addAll(Arrays.asList(superClazz.getDeclaredFields())); 
     members.addAll(Arrays.asList(superClazz.getDeclaredMethods())); 
     superClazz = superClazz.getSuperclass(); 
    } 
    boolean childFieldFound = false; 
    for (AccessibleObject member : members) { 
     if (member.isAnnotationPresent(Field.class)) { 
     AccessController.doPrivileged((PrivilegedAction<Void>)() -> { member.setAccessible(true); return null; }); 
     DocField df = new DocField(member); 
     if (df.child != null) { 
      if (childFieldFound) 
      throw new BindingException(clazz.getName() + " cannot have more than one Field with child=true"); 
      childFieldFound = true; 
     } 
     fields.add(df); 
     } 
    } 
    return fields; 
    } 
3
HttpSolrServer solr = new HttpSolrServer(SOLR_URL); 

     // Docs to submit 
     Collection<SolrInputDocument> batch = new ArrayList<SolrInputDocument>(); 

     // Parent Doc 1, a person mamed John Jones 
     SolrInputDocument person1 = new SolrInputDocument(); 
     person1.addField("id",   "john_jones"); 
     person1.addField("content_type", "person" ); 
     // "_t" suffix tells Solr that it's text 
     person1.addField("first_name_t", "John"  ); 
     person1.addField("last_name_t", "Jones"  ); 
     // states and history used in edismax examples 
     person1.addField("states_t",  "California Nevada Idaho Maine"); 
     person1.addField("history_t",  "safe accident accident accident accident accident"); 

     // child docs, the vehicles he owns 
     SolrInputDocument p1_car1 = new SolrInputDocument(); 
     p1_car1.addField("id",   "jj_car1" ); 
     p1_car1.addField("content_type", "car"  ); 
     // For cars "make" is an alias for "manufacturer" 
     p1_car1.addField("make_t",  "Honda"  ); 
     p1_car1.addField("model_t",  "Accord" ); 

     SolrInputDocument p1_car2 = new SolrInputDocument(); 
     p1_car2.addField("id",   "jj_car2" ); 
     p1_car2.addField("content_type", "car"  ); 
     p1_car2.addField("make_t",  "Nissan" ); 
     p1_car2.addField("model_t",  "Maxima" ); 

     SolrInputDocument p1_bike1 = new SolrInputDocument(); 
     p1_bike1.addField("id",   "jj_bike1" ); 
     p1_bike1.addField("content_type", "bike"  ); 
     p1_bike1.addField("make_t",  "Yamaha" ); 
     p1_bike1.addField("model_t",  "Passion" ); 

     SolrInputDocument p1_bike2 = new SolrInputDocument(); 
     p1_bike2.addField("id",   "jj_bike2" ); 
     p1_bike2.addField("content_type", "bike"  ); 
     p1_bike2.addField("make_t",  "Peugeot" ); 
     p1_bike2.addField("model_t",  "Vivacity" ); 

     // Add children to parent 
     person1.addChildDocument(p1_car1 ); 
     person1.addChildDocument(p1_car2 ); 
     person1.addChildDocument(p1_bike1); 
     person1.addChildDocument(p1_bike2); 

     // Add parent to batch 
     batch.add(person1); 


     // Parent Doc 2, person mamed Satish Smith 
     SolrInputDocument person2 = new SolrInputDocument(); 
     person2.addField("id",   "satish_smith"); 
     person2.addField("content_type", "person"  ); 
     person2.addField("first_name_t", "Satish"  ); 
     person2.addField("last_name_t", "Smith"  ); 
     person2.addField("states_t",  "California Texas California Maine Vermont Connecticut"); 
     person2.addField("history_t", "safe safe safe safe safe safe safe safe accident"); 

     // Vehicles (child docs) 
     SolrInputDocument p2_car1 = new SolrInputDocument(); 
     p2_car1.addField("id",   "ss_car1" ); 
     p2_car1.addField("content_type", "car"  ); 
     p2_car1.addField("make_t",  "Peugeot" ); 
     p2_car1.addField("model_t",  "iOn"  ); 
     SolrInputDocument p2_bike1 = new SolrInputDocument(); 
     p2_bike1.addField("id",   "ss_bike1" ); 
     p2_bike1.addField("content_type", "bike"  ); 
     p2_bike1.addField("make_t",  "Honda"  ); 
     p2_bike1.addField("model_t",  "Spree"  ); 
     // link objects and add to batch 
     person2.addChildDocument(p2_car1 ); 
     person2.addChildDocument(p2_bike1); 
     batch.add(person2); 

     System.out.println("Adding batch of " + batch.size() + " parent docs"); 

     // Submit as a group 
     solr.add(batch); 
     solr.commit(); 
+1

這個問題是關於一個bean類的插入。順便複製粘貼代碼:http://stackoverflow.com/questions/27983644/searching-for-nested-documents-in-solrj –

相關問題