7장. Hibernate Search
7.1. Hibernate Search 시작하기 링크 복사링크가 클립보드에 복사되었습니다!
7.1.1. Hibernate Search 정보 링크 복사링크가 클립보드에 복사되었습니다!
Hibernate Search는 Hibernate 애플리케이션에 전체 텍스트 검색 기능을 제공합니다. 전체 텍스트, 퍼지 및 지리적 위치 검색을 포함하여 SQL 기반 솔루션이 적합하지 않은 애플리케이션을 검색하는 데 특히 적합합니다. Hibernate Search는 Apache Lucene을 전체 텍스트 검색 엔진으로 사용하지만 유지 관리 오버헤드를 최소화하도록 설계되었습니다. 구성되고 나면 인덱싱, 클러스터링 및 데이터 동기화가 투명하게 유지되므로 비즈니스 요구 사항을 충족하는 데 집중할 수 있습니다.
이전 JBoss EAP 릴리스에는 Hibernate 4.2 및 Hibernate Search 4.6이 포함되었습니다. JBoss EAP 7에는 Hibernate 5 및 Hibernate Search 5.5가 포함되어 있습니다.
네이티브 Lucene API를 사용하는 경우 이 버전에 맞게 조정하십시오.
7.1.2. Hibernate 검색 개요 링크 복사링크가 클립보드에 복사되었습니다!
Hibernate Search는 인덱스 검색 구성 요소뿐만 아니라 색인 검색 구성 요소로 구성되어 있으며 둘 다 Apache Lucene에서 지원합니다. 데이터베이스에서 엔터티를 삽입, 업데이트 또는 제거할 때마다 Hibernate Search는 Hibernate 이벤트 시스템을 통해 이 이벤트를 추적하고 인덱스 업데이트를 예약합니다. 이러한 모든 업데이트는 Apache Lucene API와 직접 상호 작용할 필요 없이 처리됩니다. 대신 기본 Lucene 인덱스와의 상호 작용은 IndexManager 를 통해 처리됩니다. 기본적으로 IndexManager와 Lucene 인덱스 사이에는 일대일 관계가 있습니다. IndexManager는 선택한 백엔드,reader 전략 및 DirectoryProvider 를 포함한 특정 인덱스 구성을 추상화합니다.
인덱스가 생성되면 기본 Lucene 인프라를 처리하는 대신 엔터티를 검색하고 관리 엔터티 목록을 반환할 수 있습니다. Hibernate와 Hibernate Search 간에 동일한 지속성 컨텍스트를 공유합니다. FullTextSession 클래스는 Hibernate 세션 클래스 위에 구축되어 애플리케이션 코드가 통합 org.hibernate.Query 또는 API와 동일한 방식으로 HQL, Jakarta Persistence 쿼리 언어 또는 네이티브 쿼리와 정확히 동일합니다.
javax.persistence.Query
트랜잭션 배치 모드는 Java 네이밍 및 디렉터리 인터페이스를 기반으로 하는지 여부에 관계없이 모든 작업에 권장됩니다.
Java Naming 및 Directory Interface 또는 Jakarta Transactions와 관계없이 데이터베이스와 Hibernate Search 모두 트랜잭션에서 작업을 실행하는 것이 좋습니다.
Hibernate Search는 원자성 대화로 알려진 Hibernate 또는 EntityManager 긴 대화 패턴에서 완벽하게 작동합니다.
7.1.3. 디렉터리 공급자 정보 링크 복사링크가 클립보드에 복사되었습니다!
Hibernate Search 인프라의 일부인 Apache Lucene은 인덱스 저장 디렉터리의 개념을 가지고 있습니다. Hibernate Search는 디렉터리 공급자를 통해 Lucene Directory 인스턴스의 초기화 및 구성을 처리합니다.
directory_provider 속성은 인덱스를 저장하는 데 사용할 디렉터리 공급자를 지정합니다. 기본 파일 시스템 디렉터리 프로바이더는 로컬 파일 시스템을 사용하여 인덱스를 저장하는 filesystem 입니다.
7.1.4. 작업자 정보 링크 복사링크가 클립보드에 복사되었습니다!
Lucene 인덱스 업데이트는 Hibernate Search Worker 에서 처리합니다. 이 작업자는 모든 엔터티 변경 사항을 수신하고 컨텍스트별로 대기열을 지정한 다음 컨텍스트가 종료되면 적용합니다. 가장 일반적인 컨텍스트는 트랜잭션이지만 엔터티 변경 수 또는 기타 애플리케이션 이벤트 수에 따라 달라질 수 있습니다.
효율성을 높이기 위해 상호 작용은 일괄 처리되며 컨텍스트가 끝나면 일반적으로 적용됩니다. 트랜잭션 외부에서는 실제 데이터베이스 작업 후에 인덱스 업데이트 작업이 실행됩니다. 진행 중인 트랜잭션의 경우 인덱스 업데이트 작업은 트랜잭션 커밋 단계에 맞게 예약되고 트랜잭션 롤백 시 삭제됩니다. 작업자는 컨텍스트에 관계없이 인덱싱이 수행된 후 특정 배치 크기 제한을 사용하여 구성할 수 있습니다.
이 인덱스 업데이트를 처리하는 방법에는 두 가지 즉각적인 이점이 있습니다.
- 성능: 배치에서 작업을 실행할 때 Lucene 인덱싱이 더 효과적입니다.
- 초대도: 실행된 작업은 데이터베이스 트랜잭션에서 실행하는 것과 동일한 범위를 가지며 트랜잭션이 커밋된 경우에만 실행됩니다. 이는 엄격한 의미에서는 ACID가 아니지만, 언제든지 소스에서 다시 빌드할 수 있으므로 ACID 동작은 전체 텍스트 검색 색인에 거의 유용하지 않습니다.
범위와 트랜잭션이 없는 두 개의 배치 모드는 자동 커밋과 트랜잭션 동작에 해당합니다. 성능 관점에서 트랜잭션 모드가 권장됩니다. 범위 지정 선택은 투명하게 이루어집니다. Hibernate Search는 트랜잭션의 존재를 감지하고 범위를 조정합니다.
7.1.5. 백엔드 설정 및 작업 링크 복사링크가 클립보드에 복사되었습니다!
7.1.5.1. 백엔드 링크 복사링크가 클립보드에 복사되었습니다!
Hibernate Search는 다양한 백엔드를 사용하여 작업 배치를 처리합니다. 백엔드는 구성 옵션 default.worker.backend 로 국한되지 않습니다. 이 속성은 백엔드 구성의 일부인 백엔드QueueProcessor 인터페이스의 구현을 지정합니다. 백엔드(예: Jakarta Messaging 백엔드)를 설정하려면 추가 설정이 필요합니다.
7.1.5.2. Lucene 링크 복사링크가 클립보드에 복사되었습니다!
Lucene 모드에서는 노드의 모든 인덱스 업데이트가 디렉터리 공급업체를 사용하여 Lucene 디렉터리에 동일한 노드에서 실행됩니다. 비클러스터형 환경이나 공유 디렉터리 저장소가 있는 클러스터형 환경에서 이 모드를 사용합니다.
그림 7.1. Lucene 백엔드 구성
Lucene 모드는 디렉터리가 잠금 전략을 관리하는 비클러스터형 또는 클러스터된 애플리케이션을 대상으로 합니다. Lucene 모드의 주요 장점은 단순하고 Lucene 쿼리의 변경 사항을 즉시 확인하는 것입니다. NRT(Non-Real Time) 백엔드는 비클러스터형 인덱스 구성 및 비공유 인덱스 구성의 대체 백엔드입니다.
7.1.5.3. 자카르타 메시징 링크 복사링크가 클립보드에 복사되었습니다!
노드의 인덱스 업데이트가 자카르타 메시징 큐로 전송됩니다. 고유한 리더는 대기열을 처리하고 마스터 인덱스를 업데이트합니다. 이후 마스터 인덱스는 마스터 및 슬레이브 패턴을 설정하기 위해 슬레이브 복사본에 정기적으로 복제됩니다. 마스터는 Lucene 인덱스 업데이트를 담당합니다. 슬레이브는 읽기 및 쓰기 작업을 허용하지만 로컬 인덱스 복사본에 대한 읽기 작업을 처리합니다. 마스터는 Lucene 인덱스를 업데이트하는 데만 책임이 있습니다. 마스터만 업데이트 작업에 로컬 변경 사항을 적용합니다.
그림 7.2. 자카르타 메시징 서비스 백엔드 구성
이 모드는 처리량이 중요하고 인덱스 업데이트 지연이 경제적인 클러스터형 환경을 대상으로 합니다. 자카르타 메시징 공급자는 안정성을 보장하고 슬레이브를 사용하여 로컬 인덱스 복사본을 변경합니다.
7.1.6. 독자 전략 링크 복사링크가 클립보드에 복사되었습니다!
쿼리를 실행할 때 Hibernate Search는 reader 전략을 사용하여 Apache Lucene 인덱스와 상호 작용합니다. 자주 사용하는 업데이트와 같은 애플리케이션의 프로필을 기반으로 reader 전략을 선택하고, 주로 읽기, 비동기 인덱스 업데이트.
7.1.6.3. 사용자 정의 리더 전략 링크 복사링크가 클립보드에 복사되었습니다!
org.hibernate.search.reader.ReaderProvider 구현을 사용하여 사용자 정의 리더 전략을 작성할 수 있습니다. 구현은 안전한 스레드여야 합니다.