package com.manning.hsia.dvdstore; import com.manning.hsia.test.ch13.SearchTestCase; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Query; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleFragmenter; import org.hibernate.Transaction; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.SearchFactory; import org.hibernate.search.reader.ReaderProvider; import org.hibernate.search.store.DirectoryProvider; import org.testng.annotations.Test; import java.io.StringReader; import java.util.List; public class TestHighlighter extends SearchTestCase { private IndexReader reader; private Analyzer analyzer = new StandardAnalyzer(); private ReaderProvider readerProvider; String desc[] = { "Keanu Reeves is completely wooden in this romantic misfire. Reeves plays a traveling salesman and agrees to help a woman", "Jamie Lee Curtis) finds out that he's not really a salesman and Bill Paxton is a used-car salesman." }; @Test(groups="ch13") public void testSimpleHighLighter() throws Exception { FullTextSession session = Search.getFullTextSession( openSession() ); try { buildIndex( session ); Transaction tx = session.beginTransaction(); QueryParser parser = new QueryParser( "description", analyzer ); Query query = parser.parse( "salesman" ); query = query.rewrite( reader ); org.hibernate.search.FullTextQuery hibQuery = session.createFullTextQuery( query, Dvd.class ); List<Dvd> results = hibQuery.list(); Highlighter highlighter = new Highlighter( new QueryScorer( query ) ); highlighter.setTextFragmenter( new SimpleFragmenter( 20 ) ); int maxNumFragmentsRequired = 3; for (Dvd p : results) { String text = p.getDescription(); TokenStream tokenStream = analyzer.tokenStream( "description", new StringReader( text ) ); String result = highlighter.getBestFragments( tokenStream, text, maxNumFragmentsRequired, " ..." ); assert result != null : "null result"; assert result.length() > 0 : "0 length result"; System.out.println( result ); } readerProvider.closeReader( reader ); for (Object element : session.createQuery( "from " + Dvd.class.getName() ).list()) session.delete( element ); tx.commit(); } finally { session.close(); } } private void buildIndex( FullTextSession session ) throws Exception { getReader( session ); Transaction tx = session.beginTransaction(); for (int x = 0; x < desc.length; x++) { Dvd dvd = new Dvd(); dvd.setId( x ); dvd.setDescription( desc[x] ); session.save( dvd ); } tx.commit(); } private void getReader( FullTextSession session ) { SearchFactory searchFactory = session.getSearchFactory(); DirectoryProvider provider = searchFactory.getDirectoryProviders( Dvd.class )[0]; readerProvider = searchFactory.getReaderProvider(); reader = readerProvider.openReader( provider ); } protected Class[] getMappings() { return new Class[]{ Dvd.class }; } }