Hibernate Search 中文操作指南
9. Main API Entry Points
本部分详细介绍了在运行时访问 Hibernate Search API 的主要入口点,即用于索引、搜索、查找元数据等的 API。
9.1. SearchMapping
9.1.1. Basics
_SearchMapping_是 Hibernate Search API 的最顶层入口:它表示从实体到索引的完整映射。
SearchMapping_是线程安全的:可从多个线程安全并行使用。然而,这并不意味着它返回的对象(_SearchWorkspace,…)都是线程安全的。
Hibernate Search 中的 SearchMapping 等同于 JPA/Hibernate ORM 中的 EntityManagerFactory/SessionFactory。 |
一些框架(如 Quarkus )允许您简单地将 @Inject the SearchMapping 注入到您的 CDI bean 中。 |
9.1.2. Retrieving the SearchMapping with the Hibernate ORM integration
使用 Hibernate ORM integration,SearchMapping 将 created automatically when Hibernate ORM starts。
要检索_SearchMapping_,请调用_Search.mapping(…)并传递_EntityManagerFactory/SessionFactory:
示例 8. 从 Hibernate ORM SessionFactory 检索 SearchMapping
SessionFactory sessionFactory = /* ... */ (1)
SearchMapping searchMapping = Search.mapping( sessionFactory ); (2)
仍然使用 Hibernate ORM integration,可以从 JPA EntityManagerFactory 中执行相同操作:
示例 9. 从 JPA EntityManagerFactory 检索 SearchMapping
EntityManagerFactory entityManagerFactory = /* ... */ (1)
SearchMapping searchMapping = Search.mapping( entityManagerFactory ); (2)
9.1.3. Retrieving the SearchMapping with the Standalone POJO Mapper
使用 Standalone POJO Mapper,SearchMapping 是启动 Hibernate Search 的结果。
请参阅 this section 以获取有关使用独立 POJO 映射器启动 Hibernate Search 的更多信息。
9.2. SearchSession
9.2.1. Basics
_SearchSession_代表执行一系列相关操作的上下文。通常应该在很短的时间内使用它,例如处理单个 Web 请求。
SearchSession 不是线程安全的:它不能从多个线程同时使用。
Hibernate Search 中的 SearchSession 等同于 JPA/Hibernate ORM 中的 EntityManager/Session。 |
一些框架(如 Quarkus )允许您简单地将 @Inject the SearchSession 注入到您的 CDI bean 中。 |
9.2.2. Retrieving the SearchSession with the Hibernate ORM integration
要使用 Hibernate ORM integration 检索 SearchSession,请调用 Search.session(…) 并传递 EntityManager/Session:
示例 10. 从 Hibernate ORM Session 检索 SearchSession
Session session = /* ... */ (1)
SearchSession searchSession = Search.session( session ); (2)
仍然使用 Hibernate ORM integration,可以从 JPA EntityManager 中执行相同操作:
示例 11. 从 JPA EntityManager 检索 SearchSession
EntityManager entityManager = /* ... */ (1)
SearchSession searchSession = Search.session( entityManager ); (2)
9.2.3. Retrieving the SearchSession with the Standalone POJO Mapper
使用 Standalone POJO Mapper,SearchSession 应明确创建并关闭:
示例 12. 创建 SearchSession
SearchMapping searchMapping = /* ... */ (1)
try ( SearchSession searchSession = searchMapping.createSession() ) { (2)
// ...
}
忘记关闭 SearchSession 会导致不执行索引操作,甚至可能造成内存泄漏。
SearchSession 也可以用几个选项进行配置:
示例 13. 使用选项创建 SearchSession
SearchMapping searchMapping = /* ... */ (1)
Object tenantId = "myTenant";
try ( SearchSession searchSession = searchMapping.createSessionWithOptions() (2)
.indexingPlanSynchronizationStrategy( IndexingPlanSynchronizationStrategy.sync() )(3)
.tenantId( tenantId )
.build() ) { (4)
// ...
}
9.3. SearchScope
_SearchScope_代表一组已编制索引的实体及其索引。
SearchScope_是线程安全的:可从多个线程安全并行使用。然而,这并不意味着它返回的对象(_SearchWorkspace,…)都是线程安全的。
可以从 SearchMapping 和 SearchSession 中检索 SearchScope 。
示例 14. 从 SearchMapping 检索 SearchScope
SearchMapping searchMapping = /* ... */ (1)
SearchScope<Book> bookScope = searchMapping.scope( Book.class ); (2)
SearchScope<Person> associateAndManagerScope = searchMapping.scope( Arrays.asList( Associate.class, Manager.class ) ); (3)
SearchScope<Person> personScope = searchMapping.scope( Person.class ); (4)
SearchScope<Person> personSubTypesScope = searchMapping.scope( Person.class,
Arrays.asList( "Manager", "Associate" ) ); (5)
SearchScope<Object> allScope = searchMapping.scope( Object.class ); (6)
示例 15. 从 SearchSession 检索 SearchScope
SearchSession searchSession = /* ... */ (1)
SearchScope<Book> bookScope = searchSession.scope( Book.class ); (2)
SearchScope<Person> associateAndManagerScope =
searchSession.scope( Arrays.asList( Associate.class, Manager.class ) ); (3)
SearchScope<Person> personScope = searchSession.scope( Person.class ); (4)
SearchScope<Person> personSubTypesScope = searchSession.scope( Person.class,
Arrays.asList( "Manager", "Associate" ) ); (5)
SearchScope<Object> allScope = searchSession.scope( Object.class ); (6)