2013-07-06 115 views
3

Hibernate Search(lucene)中是否有可能合併兩個不同的查詢。例如,當我想搜索2個字段,應該有一個相應的匹配值:在hibernate搜索中合併查詢

firstname - John 
lastname - Doe 

qBuilder.keyword().onField("firstname").matching("John").createQuery()); 
qBuilder.keyword().onField("lastname").matching("Doe").createQuery()); 

是從這一個查詢做出的方法?

回答

5

注:這工作,但對於更多的Hibernate式的做法,看到我的其他答案

createQuery()返回一個標準的Lucene Query。因此,合併在Lucene的兩個查詢典型的方法是用BooleanQuery

Query query1 = qBuilder.keyword().onField("firstname").matching("John").createQuery(); 
Query query2 = qBuilder.keyword().onField("lastname").matching("Doe").createQuery(); 
BooleanQuery bq = new BooleanQuery(); 
//Assuming you want to require a match on both first and last names. 
//If a match on either is enough, use BooleanClause.Occur.SHOULD 
bq.add(new BooleanClause(query1, BooleanClause.Occur.MUST)); 
bq.add(new BooleanClause(query2, BooleanClause.Occur.MUST)); 
3

而不是使用Lucene的BooleanQuery直接,更休眠的方式來做到這將是使用Hibernate bool()查詢(見5.1在documentation here)的.2.6:

Query query = qBuilder.bool() 
    .must(qBuilder.keyword().onField("firstname").matching("John").createQuery()) 
    .must(qBuilder.keyword().onField("lastname").matching("Doe").createQuery()) 
    .createQuery(); 
+0

非常感謝。如果值「firstname」或「lastname」爲空(如果用戶只搜索「John」,而沒有提供「Doe」),那麼該怎麼辦?我們能否使用類似的查詢,而不必首先檢查空值。這是針對我們有很多可選搜索參數的場景。 – MichaelCleverly

+1

@MichaelCleverly - 如果條款應該是可選的,只需將它們添加爲'.should'而不是'.must'。 – femtoRgon

+0

完美 - 非常感謝。 – MichaelCleverly