2009-06-01 7 views
4

하이버 네이트 검색을 하이버 네이트 애플리케이션과 통합하기 시작했습니다. 데이터는 서버를 시작할 때마다 Hibernate Session을 사용하여 인덱싱됩니다.하이버 네이트 검색에서 데이터 인덱싱

FullTextSession fullTextSession = Search.getFullTextSession(session); 
Transaction tx = fullTextSession.beginTransaction(); 

List books = session.createQuery("from Book as book").list(); 
for (Book book : books) { 
    fullTextSession.index(book); 
} 

tx.commit(); //index is written at commit time  

매우 어색하며 서버를 시작하는 데 10 분이 걸립니다. 올바른 방법으로이 작업을 수행하고 있습니까?

색인을 주기적으로 업데이트하는 스케줄러를 작성했습니다. 이렇게하면 기존 색인 항목이 자동으로 업데이트되거나 중복 색인이 생성됩니까?

답변

10

당신이 사용하는 경우 최대 절전 모드 검색 가이드, 섹션 3.6.1에서와 같이 상세한 주석 -

나는 당신이 온라인 설명서의 자동 및 수동 인덱싱 섹션을 참조하는 것이 좋습니다 최대 절전 모드 주석 또는 최대 절전 모드를 사용하는 경우

최대 절전 모드 검색이 상자에서 사용할 수 있습니다 : (이제 기본적으로), 저장에 색인을 시작 청취자는 기본적으로 등록 EntityManager. 에 대해 비활성화해야하는 경우 hibernate.search.autoregister_listeners 을 false로 설정하십시오.

손으로 전원을 켭니다하는 방법에 대한 예 :

hibConfiguration.setListener("post-update", new FullTextIndexEventListener()); 
hibConfiguration.setListener("post-insert", new FullTextIndexEventListener()); 
hibConfiguration.setListener("post-delete", new FullTextIndexEventListener()); 

당신이

@Indexed(index = "fulltext") 

주석 색인 할 엔티티에 주석을하기 만하면, 그런 다음 사용자 가이드에 설명 된대로 필드에 대한 세부적인 주석을 작성하십시오.

인덱싱을 사용하기 전에 저장된 엔티티가 없으면 저장시 손으로 인덱싱을 시작하지 말고 응용 프로그램이 시작될 때 색인을 다시 실행하지 마십시오.

"첨부"가있는 개체를 저장할 때 성능 문제가 발생할 수 있으며 개체를 저장하는 트랜잭션의 동일한 범위에서 인덱싱 할 수 있습니다. 여기를 참조하십시오 :

Hibernate Search and offline text extraction

이 문제를 해결하는 솔루션.

+1

이 답변은 특히 위의 답변이 잘못되었습니다. 엔터티를 저장할 때 손으로 인덱싱을 시작하는 일반적인 절차가 아닙니다. –

1

FSDirectoryProvider (기본값)를 사용하는 경우 Lucene 색인이 디스크에 유지됩니다. 즉, 시작시 색인을 생성 할 필요가 없습니다. 기존 데이터베이스가있는 경우 fullTextSession.index() 기능을 사용하여 초기 인덱스를 만들 수 있습니다. 그러나 이것은 응용 프로그램을 시작하지 않아야합니다. 일종의 트리거 URL 또는 관리자 인터페이스 노출을 고려하십시오. 초기 색인을 얻으면 자동 색인 생성을 사용하는 것이 좋습니다. 즉, 책이 생성/업데이트/삭제되면 Lucene 색인이 자동으로 업데이트됩니다. 자동 인덱싱 또한 기본적으로 사용하도록 설정되어야합니다. http://docs.jboss.org/hibernate/stable/search/reference/en/html_single

--Hardy

+0

자동 색인 생성을 어떻게 사용할 수 있습니까? 동일한 구성은 무엇입니까? – Shashi

+0

최대 절전 모드 주석을 사용하는 경우 기본적으로 자동 인덱싱이 사용됩니다. 주석을 사용하고 있지 않다면 FullTextIndexEventListener를 등록해야합니다 : http://docs.jboss.org/hibernate/stable/search/reference/en/html_single/#search-configuration-event – Hardy

0

현재 JPA에서 Hibernate Search의 자동 인덱싱을 사용하고 있으며 실제로 잘 작동합니다.그냥 다음을 호출 할 수 있습니다 처음에 인덱스를 만들려면 :

FullTextEntityManager fullTextEntityManager = 
        Search.getFullTextEntityManager(entityManager); 

    try { 
     fullTextEntityManager.createIndexer().startAndWait(); 
    } catch (InterruptedException e) { 
     // Exception handling 
    } 

는 여기서 "위해 entityManager는"단지 javax.persistence.EntityManager입니다. 위의 코드는 @Indexed로 표시된 모든 엔티티에 대해 @Field로 표시된 모든 필드의 색인을 생성합니다.

엔티티 관리자를 통해 모든 업데이트를 수행하면 인덱스가 자동으로 업데이트됩니다. 평소와 같이 검색 할 수 있지만 각 검색에서 EntityManager를 다시 만들도록하십시오 (EntityManagerFactory를 사용하여 그렇게 할 수 있습니다).

+0

이것은 Hibernate Search 버젼 3.2+에서만 사용 가능하다는 것에 주목하라. ([Hibernate Search 3.2 : 빠른 인덱스 리빌드] (http://relation.to/13387.lace) –

+0

app db가 멀티 테넌 시일 경우 ? – KyelJmD

+0

@KyelJmD 예.이 도구를 사용하는 응용 프로그램은 단일 DB 다중 사용자이거나 다중 DB/다중 스키마 다중 사용자를 언급하고 있습니까? 그렇다면이 도구를 사용해보십시오. – brent777

관련 문제