第 7 章 Hibernate Search
7.1. Hibernate Search 入门 复制链接链接已复制到粘贴板!
7.1.1. 关于 Hibernate Search 复制链接链接已复制到粘贴板!
Hibernate 搜索为 Hibernate 应用程序提供全文本搜索功能。尤其适合搜索基于 SQL 的解决方案不适合的应用程序,包括全文本、模糊搜索和地理位置搜索。Hibernate Search 使用 Apache Lucene 作为其全文本搜索引擎,但旨在最大限度地降低维护开销。配置后,索引、群集和数据同步将保持透明,让您专注于满足您的业务需求。
之前的 JBoss EAP 版本包括 Hibernate 4.2 和 Hibernate Search 4.6。JBoss EAP 7 包括 Hibernate 5 和 Hibernate Search 5.5。
Hibernate Search 5.5 与 Java 7 协同工作,现在基于 Lucene 5.3.x 构建。如果您使用任何原生 Lucene API,请确保与这个版本一致。
7.1.2. Hibernate 搜索概述 复制链接链接已复制到粘贴板!
Hibernate 搜索由索引组件和索引搜索组件组成,它们都由 Apache Lucene 支持。每次从数据库插入、更新或删除实体时,Hibernate Search 都会通过 Hibernate 事件系统跟踪此事件并计划索引更新。所有这些更新都会被处理,而无需直接与 Apache Lucene API 交互。相反,与底层 Lucene 索引的交互是通过索引 管理器
来处理的。默认情况下,IndexManager 和 Lucene 索引之间有一个一对一的关系。IndexManager 会提取特定的索引配置,包括所选后端、readread 策略和 DirectoryProvider。
索引创建后,您可以搜索实体并返回受管实体列表,而不是处理底层 Lucene 基础架构。Hibernate 和 Hibernate 搜索之间共享相同的持久性上下文。FullTextSession
类构建在 Hibernate 会话
类之上,以便应用程序代码可以使用统一 org.hibernate.Query
或 javax.persistence.Query
API,其方式与 HQL、Java Persistence 查询语言(JPQL)或原生查询相同。
建议在所有操作中使用事务性批处理模式,无论它们是基于 Java 命名和目录接口。
建议针对您的数据库和 Hibernate 搜索在事务中执行您的操作,无论是 Java 命名和目录界面还是 Jakarta Transactions。
Hibernate 搜索在 Hibernate 或实体管理器长对话模式中运行完美,称为原子对话。
7.1.3. 关于目录提供程序 复制链接链接已复制到粘贴板!
Apache Lucene 是 Hibernate Search 基础架构的一部分,拥有用于存储索引的目录的概念。Hibernate Search 通过目录提供程序处理 Lucene Directory 实例的初始化和配置。
directory_provider
属性指定用于存储索引的目录提供程序。默认文件系统目录提供商是 filesystem
,它使用本地文件系统来存储索引。
7.1.4. 关于工作程序 复制链接链接已复制到粘贴板!
Lucene 索引的更新由 Hibernate Search Worker 处理,它接收所有实体更改,按照上下文对其进行队列,并在上下文结束时应用它们。最常见的上下文是事务,但可能取决于实体更改的数量或其他一些应用事件。
为提高效率,交互分批,一般在上下文结束时应用。在事务之外,索引更新操作会在实际数据库操作后执行。如果是持续事务,则为事务提交阶段调度索引更新操作,并在交易回滚时丢弃。工作程序可以配置特定的批处理大小限制,之后无论上下文如何进行索引。
这种处理索引更新的方法有两大好处:
- 性能:Lucene 索引在批量执行时效果更好。
- acidity:执行的工作范围与数据库事务所执行的范围相同,并且仅在提交事务时执行。这在严格意义上不是 ACID,但 ACID 行为对于完整文本搜索索引很少有用,因为它们可以随时从源重建。
两种批处理模式(无范围与事务)等同于 autocommit 与事务性行为。从性能角度看,建议使用事务模式。范围选择是透明的。Hibernate Search 可检测是否存在交易并调整范围范围。
7.1.5. 后端设置和操作 复制链接链接已复制到粘贴板!
7.1.5.1. 后端 复制链接链接已复制到粘贴板!
Hibernate Search 使用各种后端来处理批量工作。后端不限于配置选项 default.worker.backend
。此属性指定 BackendQueueProcessor
接口的实施,该接口是后端配置的一部分。设置后端需要额外的设置,如 Jakarta Messaging 后端。
7.1.5.2. lucene 复制链接链接已复制到粘贴板!
在 Lucene 模式中,节点的所有索引更新都由同一节点使用目录提供程序对 Lucene 目录执行。在非集群环境中或带有共享目录存储的集群环境中使用此模式。
图 7.1. Lucene 后端配置
Lucene 模式针对目录管理锁定策略的非集群或集群应用程序。Lucene 模式的主要优点是简单性和 Lucene 查询中更改的即时可见性。Near Real Time(NRT)后端是非集群和非共享索引配置的替代后端。
7.1.5.3. Jakarta Messaging 复制链接链接已复制到粘贴板!
节点的索引更新发送到 Jakarta 消息传递队列。唯一的读取器处理队列并更新主索引。随后,主索引定期复制到从副本,从而建立主和从模式。主控机负责 Lucene 索引更新。slave 接受读写操作,但处理本地索引副本中的读取操作。主设备全权负责更新 Lucene 索引。仅 master 应用更新操作中的本地更改。
图 7.2. Jakarta 消息传递服务后端配置
此模式面向集群环境,其中吞吐量至关重要,并且可以节省索引更新延迟。Jakarta 消息传递供应商确保可靠性,并使用从设备更改本地索引副本。
7.1.6. 读取器策略 复制链接链接已复制到粘贴板!
在执行查询时,Hibernate Search 使用 reader 策略与 Apache Lucene 索引交互。根据应用的配置集选择一个 reader 策略,如频繁更新、阅读主要异步索引更新。
7.1.6.3. 自定义 Reader 策略 复制链接链接已复制到粘贴板!
您可以使用 org.hibernate.search.reader.ReaderProvider
编写自定义 reader 策略。实施必须安全进行。