package com.manning.hsia.dvdstore.action;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.search.FullTextSession;
import com.manning.hsia.dvdstore.model.Item;
import com.manning.hsia.dvdstore.util.SessionHolder;
/**
* Example 2.10, 2.11, 2.12, 2.13
*/
public class Searcher {
public List<Item> search() {
//Building the Lucene query
String searchQuery = "title:Batman OR description:Batman"; //query string
QueryParser parser = new QueryParser(
"title", //default field
new StandardAnalyzer() //analyzer used
);
org.apache.lucene.search.Query luceneQuery;
try {
luceneQuery = parser.parse(searchQuery); //build Lucene query
}
catch (ParseException e) {
throw new RuntimeException("Unable to parse query: " + searchQuery, e);
}
Session session = SessionHolder.getSession();
FullTextSession ftSession = org.hibernate.search.Search.getFullTextSession(session);
Query query = ftSession.createFullTextQuery(luceneQuery, Item.class);
@SuppressWarnings("unchecked")
final List<Item> results = query.list(); //execute the query
return results;
}
public List<Item> searchMultipleFields() {
// Building the Lucene query
String searchQuery = "Batman";
String[] productFields = {"title", "description"}; // targeted fields
Map<String,Float> boostPerField = new HashMap<String,Float>(2); // boost factors
boostPerField.put( "title", (float) 4);
boostPerField.put( "description", (float) 1);
QueryParser parser = new MultiFieldQueryParser( // build query parser
productFields,
new StandardAnalyzer(),
boostPerField
);
org.apache.lucene.search.Query luceneQuery;
try {
luceneQuery = parser.parse(searchQuery);
}
catch (ParseException e) {
throw new RuntimeException("Unable to parse query: " + searchQuery, e);
}
Session session = SessionHolder.getSession();
FullTextSession ftSession = org.hibernate.search.Search.getFullTextSession(session);
Query query = ftSession.createFullTextQuery(luceneQuery, Item.class); //return matching Items
query.setFirstResult(0).setMaxResults(20); //Use pagination
@SuppressWarnings("unchecked")
final List<Item> results = query.list(); //execute the query
return results;
}
}