2010-06-28 12 views
12

Üç alanlı (userId, title, description) dizinlenmiş bir nesnem var. Belirli bir kullanıcının tüm nesnelerini, başlık VEYA'nın açıklamasının belirli bir anahtar kelimeyi içerdiğini bulmak istiyorum.İç içe geçmiş boole sorgusu lucene API'siyle nasıl oluşturulur (bir AND (b OR c))?

Böyle bir şey var (ama bu besbelli yanlıştır):

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

Nasıl doğru kimliği ve başlığında veya açıklamasında arama ifadesi ile tüm nesneleri almak için kodunu değiştirmek wo?

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

cevap

22

Ben böyle bir şey olacağını düşünüyorum.

hattı 3'te böyle Yani bir şey:

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

ve sonra yerine bireysel hükümlerin yerine, bunun üzerinde yeni bir BooleanClause oluşturun.

Bu, OR mantığını geçerli AND mantığından ziyade ad/desc filtrelerinize aldığınızdan emin olmalısınız.

0

Sana etkili VEYA ilk ikisinin tek bir sorgu oluşturmak amacıyla Query.mergeBooleanQueries yöntemi kullanmak gerekir inanıyoruz:

İlgili konular