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.search.Query; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import com.manning.hsia.dvdstore.model.Distributor; import com.manning.hsia.dvdstore.model.Item; import com.manning.hsia.dvdstore.util.SessionHolder; public class ItemRetrievalActionImpl implements ItemRetrievalAction { private static Map<String, Float> boostFactors = new HashMap<String, Float>(2); private static String[] fields = new String[] {"title", "description"}; static { boostFactors.put("title", 4f); boostFactors.put("description", 1f); } /** * Example 8.4, 8.6 */ public List<Item> searchItemWithinDistributor(String search, Distributor distributor) { FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(search); FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); query.enableFullTextFilter("security"); //a filter is activated by name query.enableFullTextFilter("distributor") //more than one filter can be activated .setParameter("distributor", distributor.getName() ); //pass parameters @SuppressWarnings("unchecked") final List<Item> results = query.list(); return results; } private Query buildLuceneQuery(String search) { MultiFieldQueryParser parser = new MultiFieldQueryParser( fields, new StandardAnalyzer(), boostFactors); org.apache.lucene.search.Query luceneQuery; try { luceneQuery = parser.parse(search); } catch (ParseException e) { //do something here throw new RuntimeException("Unable to parse query: " + search, e); } return luceneQuery; } /** * Example 8.8 */ public List<Item> searchItems(String search, boolean isChild) { FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(search); FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); if (!isChild) { query.enableFullTextFilter("notachild"); //activate filter } @SuppressWarnings("unchecked") final List<Item> results = query.list(); return results; } /** * Example 8.10 */ public List<Item> searchItemsLowPrice(String search) { FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(search); FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); query.enableFullTextFilter("maximumprice").setParameter("maxPrice", 15); //enable filters @SuppressWarnings("unchecked") final List<Item> results = query.list(); return results; } /** * Example 8.11 */ private org.apache.lucene.search.Query previousLuceneQuery; //keep previous query around /** * Example 8.11 */ public List<Item> searchItems(String search) { FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(search); previousLuceneQuery = luceneQuery; FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); @SuppressWarnings("unchecked") final List<Item> results = query.list(); return results; } /** * Example 8.11 */ public List<Item> searchWithinSearch(String search) { if (previousLuceneQuery == null) return searchItems(search); FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(search); FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); query.enableFullTextFilter("searchWithinSearch") //pass previous query to filter .setParameter("previousQuery", previousLuceneQuery); @SuppressWarnings("unchecked") final List<Item> results = query.list(); return results; } public List<Item> searchWithinStock(String search) { FullTextSession ftSession = SessionHolder.getFullTextSession(); org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(search); FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Item.class); query.enableFullTextFilter("stock"); @SuppressWarnings("unchecked") final List<Item> results = query.list(); return results; } }