2016-09-15 30 views
0

是否有處理可選子查詢的最佳做法?所以說,我的搜索服務有Hibernate搜索 - 在布爾查詢中處理null

query = builder.bool().must(createQuery(field1, term1)).must(createQuery(field2, term2)).createQuery(); 

createQuery(field, term) { 
    if(term != null) { 
      return builder.keyword().onField(field).matching(term).createQuery(); 
    } 
    return null; 
} 

在默認QueryBuilder的,如果我用一個這樣的查詢和術語爲空,生成的查詢是「+字詞1 +空」或類似的規定,這將導致null當針對索引執行查詢時指針異常。有沒有推薦的方法來避免這個問題?我在想一個自定義的QueryBuilder,但我不知道如何告訴全文會話使用我的實現,而不是默認的。我能想到的唯一的另一種方式是像

query; 
query1 = createQuery(field1, term1); 
query2 = createQuery(field2, term2); 

if(query1 != null && query2 != null) { 
    query = builder.bool().must(query1).must(query2).createQuery(); 
} else if(query1 != null && query2 == null) { 
    query = query1; 
} else if(query1 == null && query2 != null) { 
    query = query2; 
} 

createQuery(field, term) { 
    if(term != null) { 
      return builder.keyword().onField(field).matching(term).createQuery(); 
    } 
    return null; 
} 

但這變得非常凌亂的真快,如果有超過子查詢了一把。

回答

0

什麼你可能做的是引進的唯一目的的方法是添加一個「必須」以無效的方式。即做這樣的事情:

BooleanJunction junction = builder.bool(); 
must(junction, createQuery(field1, term1)); 
must(junction, createQuery(field2, term2)); 
query = junction.createQuery(); 

void must(BooleanJunction junction, Query query) { 
    if (query != null) { 
     junction.must(query); 
    } 
} 

Query createQuery(String field, Object term) { 
    if(term != null) { 
      return builder.keyword().onField(field).matching(term).createQuery(); 
    } 
    return null; 
} 

這將取出的BooleanJunction API的「流動性」,但因爲它是隻有頂級的,我想這不是那麼糟糕。

0

這個怎麼

org.json.JSONObject json = new org.json.JSONObject(); 
    json.put(field1, term1); 
    json.put(field2, term2); 
    ... 


    bool = builder.bool(); 
    for (Iterator keys = json.keys(); keys.hasNext();) { 
     String field = (String) keys.next(); 
     String term = (String) json.get(field); 
     q = createQuery(field, term); 
     if (q != null) { 
      bool.must(q); 
     } 
    } 
    query = bool.createQuery(); 

,如果你有不同的術語重複的字段,你必須使用此:

org.json.JSONObject json = new org.json.JSONObject(); 
    json.append(field1, term1); 
    json.append(field2, term2); 
    ... 


    bool = builder.bool(); 
    for (Iterator keys = json.keys(); keys.hasNext();) { 
     String field = (String) keys.next(); 
     JSONArray terms = (JSONArray) json.get(field); 
     for (int i = 0; i < terms.length(); i++) { 
      String term = (String) terms.get(i); 
      q = createQuery(field, term); 
      if (q != null) { 
       bool.must(q); 
      } 
     } 
    } 
    query = bool.createQuery();