I need to do a multi-field level search on Books database using Lucene.
for example:my search criteria is something like:
(Author:a1 and title:t1) OR (Author:a2 and title:t2) OR (Author:a3 and title:t3)
where a1
, t1
etc are author names and book titles respectively. How do I get my Lucene Query object built for this kind of criteria?
Thanks!
The following code assumes a1, a2, a3, t1, t2, t3 are terms. If they are phrases, you will need to use PhraseQuery instead of 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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With