package kr.debop4j.search.hibernate.query;
import kr.debop4j.search.hibernate.SearchTestBase;
import kr.debop4j.search.hibernate.model.Dvd;
import lombok.extern.slf4j.Slf4j;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.BooleanClause;
import org.apache.lucene.search.BooleanQuery;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.Version;
import org.fest.assertions.Assertions;
import org.hibernate.Transaction;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.junit.Test;
import java.io.Reader;
import java.io.StringReader;
import java.util.List;
/**
* kr.debop4j.search.hibernate.query.QueryParserTest
*
* @author 배성혁 ( sunghyouk.bae@gmail.com )
* @since 13. 4. 23. 오후 5:06
*/
@Slf4j
public class QueryParserTest extends SearchTestBase {
@Test
public void manualAnalyzer() throws Exception {
String search = "The Little Pony";
Reader reader = new StringReader(search);
Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
TokenStream stream = analyzer.tokenStream("title", reader);
BooleanQuery query = new BooleanQuery();
while (stream.incrementToken()) {
CharTermAttribute termAttribute = stream.getAttribute(CharTermAttribute.class);
if (termAttribute.length() != 0) {
String term = new String(termAttribute.buffer(), 0, termAttribute.length());
query.add(new TermQuery(new Term("title", term)), BooleanClause.Occur.SHOULD);
}
}
Assertions.assertThat(query.toString()).isEqualTo("title:little title:pony");
System.out.println(query.toString());
}
String[] descs = new String[] {
"he hits the road as a traveling salesman",
"he's not a computer salesman",
"a traveling salesman touting the wave of the future",
"transforms into an aggressive, high-risk salesman",
"a once-successful salesman"
};
private void buildIndex(FullTextSession fts) {
Transaction tx = fts.beginTransaction();
for (int i = 0; i < descs.length; i++) {
Dvd dvd = new Dvd();
dvd.setDescription(descs[i]);
dvd.setId(i);
fts.saveOrUpdate(dvd);
}
tx.commit();
fts.clear();
}
@Test
public void testTermQuery() throws Exception {
buildIndex(fts);
Transaction tx = fts.beginTransaction();
try {
String userInput = "salesman";
Term term = new Term("description", userInput);
TermQuery query = new TermQuery(term);
log.debug("query: " + query.toString());
FullTextQuery ftq = fts.createFullTextQuery(query, Dvd.class);
@SuppressWarnings("unchecked")
List<Dvd> results = ftq.list();
Assertions.assertThat(results.size()).isEqualTo(descs.length);
Assertions.assertThat(results.get(0).getDescription()).isEqualTo(descs[1]);
for (Dvd dvd : results) {
log.debug("Dev: " + dvd.getDescription());
}
for (Object element : fts.createQuery("from " + Dvd.class.getName()).list()) {
fts.delete(element);
}
} finally {
tx.commit();
}
}
}