'Apache Lucene'에 해당되는 글 2건

  1. 2012.12.20 Apache Lucene에서 KoreanAnalyzer 사용하기 (1)
  2. 2012.12.18 Hibernate Search와 Apache Lucene 연동하기
2012.12.20 17:57

Apache Lucene에서 KoreanAnalyzer 사용하기

0. 구축환경

Hibernate Core 4.1.8 Final

Hiberante Search 4.2.0.Beta2

- Hibernate 4.1.1.Final 에서는 Verify Exception이 발생1


1. https://github.com/need4spd/lucene-Korean-Analyzer 에서 KoreanAnalyzer 소드 다운


2. 다운 받은 소스를 압축해제


3. 다운 받은 소스를 Eclipse로 import

3.1 Eclipse의 Package Explorer에서 우클릭 Import 선택

3.2 Maven - Exsiting Maven Project - Next

3.3 Root Directory의 Browse를 눌러 압축을 해제한 소스의 위치를 선택 - Finish


3.4 Import가 끝나면 Package Explorer에 luceneKoreanAnalyzer 프로젝트가 생성됨


4. com.tistory.devyongsik.analyzer 패키지의 KoreanAnalyzer 클래스에 Default 생성자 추가


5. KoreanAnalyzer를 사용하고자 하는 프로젝트에 Dependency 추가


6. 클래스의 Analyzer를 KoreanAnalyzer로 지정

@Entity
@Table(name = "author")
@Indexed
@Analyzer(impl = com.tistory.devyongsik.analyzer.KoreanAnalyzer.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
}


7. 검색 부분 구현

검색 부분 구현하는 부분은 Hibernate Search Reference를 참고

@SuppressWarnings("unchecked")
@Override
public List find(String authorName) {
	Session session = sessionFactory.getCurrentSession();

	FullTextSession fullTextSession = Search.getFullTextSession(session);

	QueryBuilder qb = fullTextSession.getSearchFactory()
			.buildQueryBuilder().forEntity(Book.class).get();

	org.apache.lucene.search.Query query = qb.keyword()
			.onFields("title", "author.firstName", "author.lastName")
			.matching(authorName).createQuery();


	org.hibernate.Query hibQuery = fullTextSession.createFullTextQuery(
			query, Book.class);

	List books = hibQuery.list();

	return books;
}


Trackback 0 Comment 1
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