2010-06-28 3 views
12

나는 3 개의 필드 (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와 제목이나 설명에 검색 구문을 가진 모든 개체를 얻을 수있는 코드를 수정 우와?

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)); 

답변

22

는 나는 이런 식으로 뭔가 될 것이라고 생각합니다.

3 행에서이 같은 뭔가 :

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

후 오히려 개별 조항보다는,이 이상의 새로운 BooleanClause을 만들 수 있습니다.

이렇게하면 현재 AND 논리가 아닌 이름/설명 필터에서 OR 논리를 가져와야합니다.

0

난 당신이 효과적인 또는 처음 두의 단일 쿼리를 만들기 위해 Query.mergeBooleanQueries 방법을 사용해야합니다 믿고 :

관련 문제