package kr.debop4j.search.hibernate.collection; import kr.debop4j.search.hibernate.SearchTestBase; import kr.debop4j.search.hibernate.model.Voc; import lombok.extern.slf4j.Slf4j; import org.apache.lucene.index.Term; import org.apache.lucene.search.*; import org.fest.assertions.Assertions; import org.hibernate.search.FullTextQuery; import org.hibernate.search.query.dsl.QueryBuilder; import org.junit.Test; import java.util.Date; import java.util.List; /** * kr.debop4j.search.hibernate.collection.CollectionTest * * @author 배성혁 sunghyouk.bae@gmail.com * @since 13. 4. 29. 오후 4:16 */ @Slf4j public class CollectionTest extends SearchTestBase { private static final String MEMO = "ASP.NET 웹 어플리케이션은 어플리케이션 Lifecycle, Page의 Lifecycle 에 상세한 event 를 정의하고 있어, event handler를 정의하면, 여러가지 선처리나 후처리를 수행할 수 있습니다."; @Test public void saveVocMemo() throws Exception { try { Voc voc = new Voc(); voc.setCreateAt(new Date()); voc.setCreator("배성혁"); voc.setMemo(MEMO); voc.setSrtype("문의"); voc.addAttr("부서", "플랫폼"); voc.addAttr("담당", "송길주"); fts.saveOrUpdate(voc); fts.flush(); fts.flushToIndexes(); fts.clear(); Voc loaded = (Voc) fts.get(Voc.class, voc.getId()); Assertions.assertThat(loaded).isNotNull(); Assertions.assertThat(loaded.getAttrs().size()).isEqualTo(2); fts.clear(); BooleanQuery luceneQuery = new BooleanQuery(); luceneQuery.add(new TermQuery(new Term("attrs.name", "담당")), BooleanClause.Occur.MUST); luceneQuery.add(new TermQuery(new Term("attrs.value", "송길주")), BooleanClause.Occur.MUST); luceneQuery.add(new WildcardQuery(new Term("memo", "정의*")), BooleanClause.Occur.MUST); FullTextQuery ftq = fts.createFullTextQuery(luceneQuery, Voc.class); System.out.println("Query=" + luceneQuery.toString()); List<Voc> vocs = (List<Voc>) ftq.list(); Assertions.assertThat(vocs.size()).isEqualTo(1); for (Voc v : vocs) { System.out.println(v.getId() + ":" + v.getMemo()); } QueryBuilder builder = getSearchDao().getQueryBuilder(Voc.class); Query query = builder.bool() .must(builder.keyword().onField("attrs.name").matching("담당").createQuery()) .must(builder.keyword().onField("attrs.value").matching("송길주").createQuery()) .must(builder.keyword().wildcard().onField("memo").matching("정의*").createQuery()) .createQuery(); vocs = (List<Voc>) fts.createFullTextQuery(query, Voc.class).list(); Assertions.assertThat(vocs.size()).isEqualTo(1); for (Voc v : vocs) { System.out.println(v.getId() + ":" + v.getMemo()); } } finally { getSearchDao().deleteAll(Voc.class); getSearchDao().clearIndex(Voc.class); } } }