package com.manning.hsia.dvdstore.action; import java.util.List; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.Term; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.TermQuery; import org.apache.lucene.search.BooleanClause.Occur; import org.hibernate.Criteria; import org.hibernate.criterion.Restrictions; import org.hibernate.search.FullTextSession; import org.hibernate.search.engine.DocumentBuilder; import com.manning.hsia.dvdstore.model.Item; import com.manning.hsia.dvdstore.model.Pizza; import com.manning.hsia.dvdstore.util.SessionHolder; public class ItemActionImpl implements ItemAction { public Item loadItem(Integer id) { FullTextSession session = SessionHolder.getFullTextSession(); //straight lookup Item itemFromGet = (Item) session.get(Item.class, id); //criteria query Criteria criteriaQuery = session.createCriteria(Item.class) .add(Restrictions.idEq(id)); Item itemFromCriteria = (Item) criteriaQuery.uniqueResult(); //full text query TermQuery termQuery = new TermQuery(new Term("id", id.toString() ) ); Item itemFromFullText = (Item) session.createFullTextQuery(termQuery, Item.class) .uniqueResult(); assert itemFromGet != null; assert itemFromGet == itemFromCriteria : "Hibernate Core unicity contract"; assert itemFromCriteria == itemFromFullText : "Hibernate Core and Search unicity contract"; assert itemFromGet == itemFromFullText : "Hibernate Core and Search unicity contract"; return itemFromFullText; } /** * Example 6.5 */ public List<?> findByTitle(String words) { FullTextSession ftSession = SessionHolder.getFullTextSession(); //get the FullTextSession< org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words, null); org.hibernate.Query query = ftSession.createFullTextQuery(luceneQuery); //create the full-text query return query.list(); } /** * Example 6.6 */ public List<Item> findItemByTitle(String words) { FullTextSession ftSession = SessionHolder.getFullTextSession(); //get the FullTextSession< org.apache.lucene.search.Query luceneQuery = buildLuceneQuery(words, Item.class); org.hibernate.Query query = ftSession.createFullTextQuery(luceneQuery, Item.class); //list entities to restrict by @SuppressWarnings("unchecked") final List<Item> results = query.list(); //execute it return results; } /** * Example 6.5 */ private org.apache.lucene.search.Query buildLuceneQuery(String words, Class<?> searchedEntity) { Analyzer analyzer; if (searchedEntity == null) { //get most appropriate analyzer analyzer = new StandardAnalyzer(); } else { analyzer = SessionHolder.getFullTextSession().getSearchFactory().getAnalyzer(searchedEntity); } QueryParser parser = new QueryParser( "title", analyzer ); org.apache.lucene.search.Query luceneQuery = null; try { luceneQuery = parser.parse(words); } catch (org.apache.lucene.queryParser.ParseException e) { throw new IllegalArgumentException("Unable to parse search entry into a Lucene query", e); } return luceneQuery; } public org.apache.lucene.search.Query buildLuceneQueryExcludePizza(String words) { QueryParser parser = new QueryParser( "title", new StandardAnalyzer() ); org.apache.lucene.search.Query userQuery = null; try { userQuery = parser.parse(words); } catch (org.apache.lucene.queryParser.ParseException e) { throw new IllegalArgumentException("Unable to parse search entry into a Lucene query", e); } org.apache.lucene.search.BooleanQuery luceneQuery = addExclusionClause(userQuery); return luceneQuery; } private org.apache.lucene.search.BooleanQuery addExclusionClause( org.apache.lucene.search.Query userQuery) { org.apache.lucene.search.Query filterQuery = new TermQuery( new Term( DocumentBuilder.CLASS_FIELDNAME, Pizza.class.getName() ) ); org.apache.lucene.search.BooleanQuery luceneQuery = new BooleanQuery(); luceneQuery.add(userQuery, Occur.MUST); luceneQuery.add(filterQuery, Occur.MUST_NOT); return luceneQuery; } }