2010-06-28 56 views
12

我有一個帶有三個字段(userId,title,description)的索引對象。我想查找標題或描述包含給定關鍵字的特定用戶的所有對象。如何使用lucene API(AND(b OR c))創建嵌套布爾查詢?

我有這樣的事情(不過這顯然是錯誤的):

WildcardQuery nameQuery = new WildcardQuery(new Term("name", filter.getSearch())); 
WildcardQuery descQuery = new WildcardQuery(new Term("description", filter.getSearch())); 

TermQuery userQuery = new TermQuery(new Term("user_id", u.getId()+"")); 

BooleanQuery booleanQuery = new BooleanQuery(); 
booleanQuery.add(new BooleanClause(name_query, Occur.SHOULD)); 
booleanQuery.add(new BooleanClause(desc_query, Occur.SHOULD)); 
booleanQuery.add(new BooleanClause(user_query, Occur.MUST)); 

如何を修改代碼以獲得用正確的ID和在標題或描述搜索短語中的所有對象?

回答

22

我認爲,這將是這樣的:

TermQuery userQuery = new TermQuery(new Term("user_id", u.getId()+"")); 

BooleanQuery orQuery = new BooleanQuery(); 
orQuery.add(new BooleanClause(name_query, Occur.SHOULD)); 
orQuery.add(new BooleanClause(desc_query, Occur.SHOULD)); 

BooleanQuery andQuery = new BooleanQuery(); 
andQuery.add(new BooleanClause(userQuery , Occur.MUST)); 
andQuery.add(new BooleanClause(orQuery, Occur.MUST)); 
0

我相信,你會需要使用Query.mergeBooleanQueries方法,以創建一個單一的查詢是有效的前兩個OR。

因此,像這樣在第3行:

Query nameOrDescQuery = Query.mergeBooleanQueries(new Query[] { nameQuery, descQuery }); 

,然後創建一個新的BooleanClause在這個,而不是個別條款。

這應該確保您在名稱/ desc過濾器上獲得OR邏輯,而不是當前的AND邏輯。