2008-12-16 37 views
5

Tôi cần thực hiện tìm kiếm cấp nhiều trường trên cơ sở dữ liệu Sách bằng cách sử dụng Lucene.Tìm kiếm đa năng trong Lucene

ví dụ: tiêu chí tìm kiếm của tôi là một cái gì đó như:

(Author:a1 and title:t1) OR (Author:a2 and title:t2) OR (Author:a3 and title:t3) 

nơi a1, t1 vv là tên tác giả và tiêu đề cuốn sách tương ứng. Làm thế nào để có được đối tượng Lucene Query được xây dựng cho loại tiêu chí này?

Cảm ơn!

Trả lời

11

Mã sau giả định a1, a2, a3, t1, t2, t3 là các thuật ngữ. Nếu chúng là các cụm từ, bạn sẽ cần phải sử dụng PhraseQuery thay vì TermQuery.

// Create a BooleanQuery for (Author:a1 and title:t1) 

BooleanQuery a1AndT1 = new BooleanQuery(); 
a1AndT1.add(new TermQuery(new Term("Author", "a1")), BooleanClause.Occur.MUST); 
a1AndT1.add(new TermQuery(new Term("title", "t1")), BooleanClause.Occur.MUST); 

// Create a BooleanQuery for (Author:a2 and title:t2) 

BooleanQuery a2AndT2 = new BooleanQuery(); 
a2AndT2.add(new TermQuery(new Term("Author", "a2")), BooleanClause.Occur.MUST); 
a2AndT2.add(new TermQuery(new Term("title", "t2")), BooleanClause.Occur.MUST); 

// Create a BooleanQuery for (Author:a3 and title:t3) 

BooleanQuery a3AndT3 = new BooleanQuery(); 
a3AndT3.add(new TermQuery(new Term("Author", "a3")), BooleanClause.Occur.MUST); 
a3AndT3.add(new TermQuery(new Term("title", "t3")), BooleanClause.Occur.MUST); 

// Create a BooleanQuery that combines the OR-clauses 

BooleanQuery query = new BooleanQuery(); 
query.add(a1AndT1, BooleanClause.Occur.SHOULD); 
query.add(a2AndT2, BooleanClause.Occur.SHOULD); 
query.add(a3AndT3, BooleanClause.Occur.SHOULD); 

// As you can see, the resulting Lucene query is 
// (+Author:a1 +title:t1) (+Author:a2 +title:t2) (+Author:a3 +title:t3) 
// which behaves the same as something like 
// (Author:a1 and title:t1) OR (Author:a2 and title:t2) OR (Author:a3 and title:t3) 

System.out.println(query); 
Các vấn đề liên quan