package com.manning.hsia.dvdstore.action; import org.hibernate.CacheMode; import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.ScrollMode; import org.hibernate.ScrollableResults; import org.hibernate.criterion.CriteriaSpecification; import org.hibernate.search.FullTextSession; import com.manning.hsia.dvdstore.model.Item; import com.manning.hsia.dvdstore.util.SessionHolder; public class IndexingActionImpl implements IndexingAction { private static int BATCH_SIZE = 100; /** * Example 9.2, 9.3, 9.4 */ public void indexAllItems() { FullTextSession session = SessionHolder.getFullTextSession(); session.purgeAll(Item.class); //remove obsolete content session.flushToIndexes(); //apply purge now, before optimize session.getSearchFactory().optimize(Item.class); //physically clear space Criteria query = session.createCriteria(Item.class) .setFetchMode("distributor", FetchMode.JOIN) //load necessary associations .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) //distinct them (due to collection load) .setCacheMode(CacheMode.IGNORE) //minimize cache interaction .setFetchSize(BATCH_SIZE); //align batch size and JDBC fetch size ScrollableResults scroll = query.scroll(ScrollMode.FORWARD_ONLY); //scroll in forward only int batch = 0; scroll.beforeFirst(); while (scroll.next()) { batch++; session.index(scroll.get(0)); if (batch % BATCH_SIZE == 0) { // no need to session.flush() since we don't change anything session.flushToIndexes(); //flush index works and clear the session session.clear(); } } // the remaining non flushed work index are processed at commit time } public void optimize() { FullTextSession session = SessionHolder.getFullTextSession(); session.getSearchFactory().optimize(); //Optimize all indexes } public void optimize(Class<?> clazz) { FullTextSession session = SessionHolder.getFullTextSession(); session.getSearchFactory().optimize(clazz); //Optimize a given class } /** * Example 9.12 */ public void reindex() { FullTextSession session = SessionHolder.getFullTextSession(); session.purgeAll(Item.class); session.flushToIndexes(); session.getSearchFactory().optimize(Item.class); //run after purge to save space Criteria query = session.createCriteria(Item.class) .setFetchMode("distributor", FetchMode.JOIN) .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY) .setCacheMode(CacheMode.IGNORE) .setFetchSize(BATCH_SIZE); ScrollableResults scroll = query.scroll(ScrollMode.FORWARD_ONLY); scroll.beforeFirst(); int batch = 0; while (scroll.next()) { batch++; session.index(scroll.get(0)); if (batch % BATCH_SIZE == 0) { // no need to session.flush() since we don't change anything session.flushToIndexes(); session.clear(); } } session.flushToIndexes(); //flush last changes before optimizing session.getSearchFactory().optimize(Item.class); //Run optimization } }