/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.query; import org.apache.lucene.index.DocsAndPositionsEnum; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.util.BytesRef; import org.hibernate.Transaction; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.SearchFactory; import org.hibernate.search.test.SearchTestBase; import org.hibernate.search.testsupport.junit.SkipOnElasticsearch; import org.junit.Test; import org.junit.experimental.categories.Category; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; /** * @author John Griffin * @author Sanne Grinovero */ @Category(SkipOnElasticsearch.class) // IndexReaders (which provide access to term vectors) are specific to the Lucene backend public class TermVectorTest extends SearchTestBase { @Test public void testPositionOffsets() throws Exception { FullTextSession s = Search.getFullTextSession( openSession() ); createIndex( s ); s.clear(); Transaction tx = s.beginTransaction(); // Here's how to get a reader from a FullTextSession SearchFactory searchFactory = s.getSearchFactory(); IndexReader reader = searchFactory.getIndexReaderAccessor().open( ElectricalProperties.class ); /** * Since there are so many combinations of results here, we are only going * to assert a few. - J.G. */ int x = 0; // only Document zero is tested: asserts rely on natural document order Terms termVector = reader.getTermVector( x, "content" ); assertNotNull( termVector ); TermsEnum iterator = termVector.iterator(); BytesRef next = iterator.next(); //move to first Document: we expect it to exist assertNotNull( next ); long totalTermFreq = iterator.totalTermFreq(); assertEquals( "electrical", next.utf8ToString() ); assertEquals( 2, totalTermFreq ); final DocsAndPositionsEnum docsAndPositions = iterator.docsAndPositions( null, null ); docsAndPositions.advance( 0 );//move to Document id 0 docsAndPositions.nextPosition(); assertEquals( 0, docsAndPositions.startOffset() );//first term in sentence assertEquals( 10, docsAndPositions.endOffset() ); docsAndPositions.nextPosition(); assertEquals( 29, docsAndPositions.startOffset() );//Term is mentioned again at character 29 // cleanup for ( Object element : s.createQuery( "from " + Employee.class.getName() ).list() ) { s.delete( element ); } searchFactory.getIndexReaderAccessor().close( reader ); tx.commit(); s.close(); } @Test public void testNoTermVector() throws Exception { FullTextSession s = Search.getFullTextSession( openSession() ); Transaction tx = s.beginTransaction(); Employee e1 = new Employee( 1000, "Griffin", "ITech" ); s.save( e1 ); tx.commit(); s.clear(); tx = s.beginTransaction(); // Here's how to get a reader from a FullTextSession SearchFactory searchFactory = s.getSearchFactory(); IndexReader reader = searchFactory.getIndexReaderAccessor().open( Employee.class ); Terms termVector = reader.getTermVector( 0, "dept" ); assertNull( "should not find a term position vector", termVector ); // cleanup for ( Object element : s.createQuery( "from " + ElectricalProperties.class.getName() ).list() ) { s.delete( element ); } searchFactory.getIndexReaderAccessor().close( reader ); tx.commit(); s.close(); } private void createIndex(FullTextSession s) { storeSeparately( s, new ElectricalProperties( 1000, "Electrical Engineers measure Electrical Properties" ) ); storeSeparately( s, new ElectricalProperties( 1001, "Electrical Properties are interesting" ) ); storeSeparately( s, new ElectricalProperties( 1002, "Electrical Properties are measurable properties" ) ); } // test relies on the order in which Lucene Documents are written, so we commit // the transaction after each entity is saved to make sure the backend doesn't reorder work. private void storeSeparately(FullTextSession s, ElectricalProperties ep) { Transaction tx = s.beginTransaction(); s.save( ep ); tx.commit(); } @Override public Class<?>[] getAnnotatedClasses() { return new Class[] { ElectricalProperties.class, Employee.class }; } }