2012-08-08 89 views
1

我使用以下代碼進行搜索使用hibernate-search。但是,這標記了搜索查詢,並執行或搜索,而我想要執行和搜索。我怎麼做?和運營商在休眠(lucene)搜索

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em); 
    String searchQuery = "test query"; 

    QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Customer.class).get(); 

    TermMatchingContext onFields = qb.keyword().onFields("customer.name","customer.shortDescription","customer.longDescription"); 

    org.apache.lucene.search.Query query = onFields.matching(searchQuery).createQuery(); 

    FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Customer.class); 

    List<Customization> result = persistenceQuery.getResultList(); 

回答

3
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em); 
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Customer.class).get(); 
TermMatchingContext onFields = qb.keyword().onFields("customer.shortDescription", "customer.longDescription"); 

BooleanJunction<BooleanJunction> bool = qb.bool(); 
org.apache.lucene.search.Query query = null; 
String[] searchTerms = searchQuery.split("\\s+"); 
for (int j = 0; j < searchTerms.length; j++) { 
    String currentTerm = searchTerms[j]; 
    bool.must(onFields.matching(currentTerm).createQuery()); 
} 

query = bool.createQuery(); 

FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Customer.class); 
resultList = persistenceQuery.getResultList(); 
2

OR邏輯爲Lucene的默認值。如此處所述,您可以使用布爾型DSL查詢 - http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-query-querydsl,但是,這可能無法解決您的問題,因爲您似乎在單個字符串中都有查詢字詞。根據您的用例(如果搜索字符串由用戶提供),從Lucene查詢解析器獲取Lucene查詢可能會更好。

+0

感謝您的鏈接。它幫助我解決了這個問題。稍後會發布我的解決方案。 – dharm0us 2012-08-14 18:52:45