package com.manning.hsia.dvdstore.ex12_19;
import com.manning.hsia.test.ch12.SearchTestCase;
import com.manning.hsia.test.Product;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.Query;
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 org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.io.File;
import java.io.StringReader;
import java.util.List;
public class TestMoreLikeThis extends SearchTestCase {
private ReaderProvider readerProvider;
String likeText =
"Keanu Reeves is completely wooden in this romantic"
+ " misfire. Reeves plays a traveling salesman and "
+ "agrees to help a woman";
String[] moreLikeFields = new String[]{"description"};
@Test(groups="ch12")
public void testMoreLikeThis() throws Exception {
FullTextSession session = Search.getFullTextSession( openSession() );
Transaction tx = session.beginTransaction();
StringReader sr = new StringReader( likeText );
IndexReader reader = getReader( session );
try {
MoreLikeThis mlt = new MoreLikeThis( reader );
mlt.setBoost( true );
mlt.setFieldNames( moreLikeFields );
mlt.setMaxQueryTerms( 2 );
mlt.setMinDocFreq( 1 );
mlt.setAnalyzer( new StandardAnalyzer() );
mlt.setMaxWordLen( 8 );
mlt.setMinWordLen( 7 );
mlt.setMinTermFreq( 1 );
Query query = mlt.like( sr );
System.out.println( query.toString() );
org.hibernate.search.FullTextQuery hibQuery =
session.createFullTextQuery( query, Product.class );
hibQuery.setProjection( FullTextQuery.DOCUMENT,
FullTextQuery.SCORE,
FullTextQuery.DOCUMENT_ID );
List<Object[]> results = hibQuery.list();
assert results.size() == 6 : "incorrect result count";
for (Object[] result : results) {
Document doc = (Document) result[0];
assert ( doc.get( "description" )
.indexOf( "salesman" ) > 0
|| doc.get( "description" )
.indexOf( "misfire" ) > 0 );
}
if ( readerProvider != null ) {
readerProvider.closeReader( reader );
}
tx.commit();
}
finally {
session.close();
}
}
private IndexReader getReader( FullTextSession session ) {
SearchFactory searchFactory =
session.getSearchFactory();
DirectoryProvider provider =
searchFactory.getDirectoryProviders( Product.class )[0];
readerProvider =
searchFactory.getReaderProvider();
return readerProvider.openReader( provider );
}
@BeforeClass(groups="ch12", alwaysRun=true)
protected void setUp() throws Exception {
File sub = locateBaseDir();
File[] files = sub.listFiles();
if ( files != null ) {
for (File file : files) {
if ( file.isDirectory() ) {
delete( file );
}
}
}
copyIndexes();
buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
}
protected Class[] getMappings() {
return new Class[]{
Product.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() );
}
}