2012.12.18 14:00

Hibernate Search와 Apache Lucene 연동하기

Apache Lucene?

100% 자바를 이용하여 검색을 위한 인텍스를 작성하게 해주고 검색을 가능하게 해주는 풀 텍스트 검색 엔진1


Hibernate Search?

Persistence domain model에 검색을 가능하게 해주는 풀 텍스트 검색 엔진2


1. Hibernate Core, Hibernate Search, Lucene Core 준비

여기에서는 Core 4.18 Final, Search 4.1.1 Final, Lucene 3.5.0을 사용

Lucene Core 3.6을 사용할 경우 java.lang.VerifyError 에러가 발생할 수 있음3


2. Hibernate 구성

hibernate-cfg.xml


	
		
		
	


root-context.xml


	
	
	
		
			${hibernate.dialect}
			${hibernate.default_schema}
			true
			25
			update
			true
			false

            
			filesystem
			/var/lucene/indexes
		
	
	


3. Domain Entity 작성

Author Class

@Entity
@Table(name = "author")
@Indexed
@Analyzer(impl = org.apache.lucene.analysis.standard.StandardAnalyzer.class)
public class Author {
	
	private static final long serialVersionUID = 4887864924331295749L;
	
	@Id
	@GeneratedValue
	@DocumentId
	private long id;
	
	@Field(index = Index.YES, store = Store.YES)
	private String firstName;
	
	@Field(index = Index.YES, store = Store.YES)
	@Boost(0.2f)
	private String lastName;

	//getters and setters
}

Book Class
@Entity
@Table(name = "book")
@Indexed
@Analyzer(impl = org.apache.lucene.analysis.standard.StandardAnalyzer.class)
public class Book {
	private static final long serialVersionUID = 2720032415972578701L;

	@Id
	@GeneratedValue
	@DocumentId
	private Long id;

	@ManyToOne(cascade = CascadeType.ALL)
	@IndexedEmbedded
	private Author author;

	@org.hibernate.annotations.Index(name = "summayIndex")
	@Field(index = Index.YES, store = Store.YES)
	private String title;

	//getters and setters
}


4. 검색 시 사용할 메소드 작성

public List find(String authorName) {
	Session session = sessionFactory.getCurrentSession();

	FullTextSession fullTextSession = Search.getFullTextSession(session);

	org.apache.lucene.search.Query q = null;
	
	try {
		String qeuryString = "author.firstName:" + authorName + " OR " + "author.lastName:" + authorName;
		
		q = new QueryParser(Version.LUCENE_31, "summary", new KeywordAnalyzer()).parse(qeuryString);
	}
	catch(Exception ex) {
		ex.printStackTrace();
	}
	
	FullTextQuery fq = fullTextSession.createFullTextQuery(q, Book.class);
	
	List books = fq.list();
	
	return books;
}


[참고]

Introduction to Lucene

Hibernate Search with Lucene

Hibernate Search - Apache Lucene Integration Reference Guide

Apache Lucene "데모 실행 및 분석"편

DEV용식 - Lucene

Trackback 0 Comment 0