2008-12-16 7 views
5

Necesito hacer una búsqueda de campo de múltiples campos en la base de datos de libros usando Lucene.Búsqueda de multifield en Lucene

por ejemplo: mis criterios de búsqueda es algo así como:

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

donde a1, t1 etc, son los nombres de autor y títulos de libros, respectivamente. ¿Cómo construyo mi objeto Lucene Query para este tipo de criterios?

Gracias!

Respuesta

11

El siguiente código supone que a1, a2, a3, t1, t2, t3 son términos. Si son frases, deberá usar PhraseQuery en lugar de 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); 
Cuestiones relacionadas