package com.manning.hsia.dvdstore.ex12_17; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Term; import org.apache.lucene.index.TermPositionVector; import org.apache.lucene.index.TermVectorOffsetInfo; import org.apache.lucene.search.Query; import org.apache.lucene.search.TermQuery; import org.hibernate.Transaction; import org.hibernate.search.FullTextQuery; 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.hibernate.search.store.FSDirectoryProvider; import com.manning.hsia.test.ch12.SearchTestCase; import org.testng.annotations.Test; import java.util.List; public class TermPositionsTest extends SearchTestCase { IndexReader reader; ReaderProvider provider; @Test(groups="ch12") public void vectorTest() throws Exception { FullTextSession session = Search.getFullTextSession(openSession()); Transaction tx = session.beginTransaction(); buildIndex(session, tx); try { tx = session.beginTransaction(); Query query = new TermQuery(new Term("content", "properties")); System.out.println(query.toString()); FullTextQuery hibQuery = session.createFullTextQuery(query, ElectricalProperties.class); hibQuery.setProjection(FullTextQuery.DOCUMENT, FullTextQuery.DOCUMENT_ID, FullTextQuery.SCORE); reader = getReader(session); List<Object[]> results = hibQuery.list(); assert results.size() > 0 : "no results returned"; for (int x = 0; x < results.size(); x++) { Integer docId = (Integer) results.get(x)[1]; TermPositionVector vector = (TermPositionVector) reader .getTermFreqVector(docId, "content"); String[] terms = vector.getTerms(); int[] f = vector.getTermFrequencies(); System.out.println(results.get(x)[2]); for (int y = 0; y < vector.size(); y++) { System.out.print("docID# =>" + docId); System.out.print(" term => " + terms[y]); System.out.print(" freq => " + f[y]); int[] positions = vector.getTermPositions(y); TermVectorOffsetInfo[] offsets = vector.getOffsets(y); for (int z = 0; z < positions.length; z++) { System.out.print(" position => " + positions[z]); System.out.print(" starting offset => " + offsets[z].getStartOffset()); System.out.println(" ending offset => " + offsets[z].getEndOffset()); } System.out.println("---------------"); } } for (Object element : session.createQuery("from " + ElectricalProperties.class.getName()).list()) session.delete(element); tx.commit(); } finally { session.close(); if (provider != null) { provider.closeReader(reader); } } } private void buildIndex(FullTextSession session, Transaction tx) throws Exception { tx = session.beginTransaction(); ElectricalProperties ep = new ElectricalProperties(); ep.setContent("Electrical Engineers measure Electrical Properties"); session.save(ep); ep = new ElectricalProperties(); ep.setContent("Electrical Properties are interesting"); session.save(ep); ep = new ElectricalProperties(); ep.setContent("Electrical Properties are measurable properties"); session.save(ep); tx.commit(); session.clear(); } private IndexReader getReader(FullTextSession session) { SearchFactory searchFactory = session.getSearchFactory(); DirectoryProvider dirProvider = searchFactory.getDirectoryProviders( ElectricalProperties.class)[0]; provider = searchFactory.getReaderProvider(); return provider.openReader(dirProvider); } protected Class[] getMappings() { return new Class[]{ ElectricalProperties.class }; } protected void configure(org.hibernate.cfg.Configuration cfg) { super.configure(cfg); cfg.setProperty("hibernate.search.default.directory_provider", FSDirectoryProvider.class.getName()); cfg.setProperty("hibernate.search.default.indexBase", locateBaseDir().getAbsolutePath()); } }