将 Hibernate Search 与 Hibernate ORM 及 Elasticsearch/OpenSearch 配合使用
你已有一个基于 Hibernate ORM 的应用,想向用户提供功能完整的全文搜索?本指南将介绍如何使用 Hibernate Search,快速把实体同步到 Elasticsearch 或 OpenSearch 集群,并通过 Hibernate Search API 查询集群。
如果需要索引的实体并非 Hibernate ORM 实体,请阅读专门的独立模式指南。
前提条件
完成本指南需要:
- 大约20分钟。
- 一个 IDE。
- 已安装 JDK 17+,并正确配置
JAVA_HOME。 - Apache Maven 3.9.16。
- 可用的容器运行时:Docker 或 Podman。
- 可选:如果希望使用 Quarkus CLI,请先安装。
- 可选:如果希望构建原生可执行文件,请安装 Mandrel 或 GraalVM 并正确配置;使用原生容器构建时也可使用 Docker。
架构
本指南的应用用于管理一个简单的图书馆,包括作者及其图书。实体存储在 PostgreSQL 数据库中,并在 Elasticsearch 集群中建立索引。
完整示例
Quarkus 文档作者建议跟随后续步骤逐步创建应用,也可以直接查看完整示例。
克隆 Git 仓库:git clone https://github.com/quarkusio/quarkus-quickstarts.git(仓库地址),或下载归档文件。完整示例位于 hibernate-search-orm-elasticsearch-quickstart 目录。
完整示例还包含测试及测试基础设施等额外内容。
创建 Maven 项目
首先创建新项目。
CLI:
quarkus create app org.acme:hibernate-search-orm-elasticsearch-quickstart \
--extension='hibernate-orm-panache,jdbc-postgresql,hibernate-search-orm-elasticsearch,rest-jackson' \
--no-code
cd hibernate-search-orm-elasticsearch-quickstart
若要创建 Gradle 项目,添加 --gradle 或 --gradle-kotlin-dsl 选项。安装及使用方法参见 Quarkus CLI 指南。
Maven:
mvn io.quarkus.platform:quarkus-maven-plugin:3.40.1:create \
-DprojectGroupId=org.acme \
-DprojectArtifactId=hibernate-search-orm-elasticsearch-quickstart \
-Dextensions='hibernate-orm-panache,jdbc-postgresql,hibernate-search-orm-elasticsearch,rest-jackson' \
-DnoCode
cd hibernate-search-orm-elasticsearch-quickstart
若要创建 Gradle 项目,添加 -DbuildTool=gradle 或 -DbuildTool=gradle-kotlin-dsl 选项。
Windows 用户需要注意:
- 使用 cmd 时,不要使用反斜杠
\续行,应将整个命令写在同一行。 - 使用 PowerShell 时,用双引号包围
-D参数,例如"-DprojectArtifactId=hibernate-search-orm-elasticsearch-quickstart"。
此命令生成 Maven 项目结构,并引入 Hibernate ORM with Panache、PostgreSQL JDBC 驱动、Hibernate Search + Elasticsearch,以及 Quarkus REST(以前称为 RESTEasy Reactive)和 Jackson 扩展。
如果已经配置好 Quarkus 项目,可在项目根目录执行以下命令添加 hibernate-search-orm-elasticsearch 扩展。
CLI:
quarkus extension add hibernate-search-orm-elasticsearch
Maven:
./mvnw quarkus:add-extension -Dextensions='hibernate-search-orm-elasticsearch'
Gradle:
./gradlew addExtension --extensions='hibernate-search-orm-elasticsearch'
这会向 pom.xml 添加以下内容:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-hibernate-search-orm-elasticsearch</artifactId>
</dependency>
build.gradle 对应内容:
implementation("io.quarkus:quarkus-hibernate-search-orm-elasticsearch")
创建基础实体
先在 model 子包中创建 Hibernate ORM 实体 Book 和 Author。
package org.acme.hibernate.search.elasticsearch.model;
import java.util.List;
import java.util.Objects;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.OneToMany;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
@Entity
public class Author extends PanacheEntity { (1)
public String firstName;
public String lastName;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) (2)
public List<Book> books;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Author)) {
return false;
}
Author other = (Author) o;
return Objects.equals(id, other.id);
}
@Override
public int hashCode() {
return 31;
}
}
- 示例使用 Hibernate ORM with Panache;这并非强制要求。
- 这里采用立即加载,使这些元素出现在 JSON 输出中。真实应用通常应考虑 DTO 方式。
package org.acme.hibernate.search.elasticsearch.model;
import java.util.Objects;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
@Entity
public class Book extends PanacheEntity {
public String title;
@ManyToOne
@JsonIgnore (1)
public Author author;
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (!(o instanceof Book)) {
return false;
}
Book other = (Book) o;
return Objects.equals(id, other.id);
}
@Override
public int hashCode() {
return 31;
}
}
- 使用
@JsonIgnore标记此属性,避免 Jackson 序列化时发生无限循环。
初始化 REST 服务
虽然 REST 服务尚未完全配置好,但可以先加入需要的标准 CRUD 操作。创建 org.acme.hibernate.search.elasticsearch.LibraryResource 类:
package org.acme.hibernate.search.elasticsearch;
import java.util.List;
import java.util.Optional;
import jakarta.enterprise.event.Observes;
import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.core.MediaType;
import org.acme.hibernate.search.elasticsearch.model.Author;
import org.acme.hibernate.search.elasticsearch.model.Book;
import org.hibernate.search.mapper.orm.session.SearchSession;
import org.jboss.resteasy.reactive.RestForm;
import org.jboss.resteasy.reactive.RestQuery;
import io.quarkus.runtime.StartupEvent;
@Path("/library")
public class LibraryResource {
@PUT
@Path("book")
@Transactional
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void addBook(@RestForm String title, @RestForm Long authorId) {
Author author = Author.findById(authorId);
if (author == null) {
return;
}
Book book = new Book();
book.title = title;
book.author = author;
book.persist();
author.books.add(book);
author.persist();
}
@DELETE
@Path("book/{id}")
@Transactional
public void deleteBook(Long id) {
Book book = Book.findById(id);
if (book != null) {
book.author.books.remove(book);
book.delete();
}
}
@PUT
@Path("author")
@Transactional
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void addAuthor(@RestForm String firstName, @RestForm String lastName) {
Author author = new Author();
author.firstName = firstName;
author.lastName = lastName;
author.persist();
}
@POST
@Path("author/{id}")
@Transactional
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
public void updateAuthor(Long id, @RestForm String firstName, @RestForm String lastName) {
Author author = Author.findById(id);
if (author == null) {
return;
}
author.firstName = firstName;
author.lastName = lastName;
author.persist();
}
@DELETE
@Path("author/{id}")
@Transactional
public void deleteAuthor(Long id) {
Author author = Author.findById(id);
if (author != null) {
author.delete();
}
}
}
这里都是 REST 服务中常见的 Hibernate ORM with Panache 操作。接下来只需添加很少的内容,就能让全文搜索应用工作。
使用 Hibernate Search 注解
回到实体,只需添加几个注解即可启用全文搜索。先修改 Book 实体:
package org.acme.hibernate.search.elasticsearch.model;
import java.util.Objects;
import jakarta.persistence.Entity;
import jakarta.persistence.ManyToOne;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
@Entity
@Indexed (1)
public class Book extends PanacheEntity {
@FullTextField(analyzer = "english") (2)
public String title;
@ManyToOne
@JsonIgnore
public Author author;
// Preexisting equals()/hashCode() methods
}
- 使用
@Indexed注解,将Book实体注册为全文索引的一部分。 @FullTextField在索引中声明一个专门用于全文搜索的字段。需要定义分析器,将文本拆分为词元(近似于单词)并分析;后文会详细说明。
图书已建立索引,接着处理作者。打开 Author 类,加入以下内容。这里同样使用 @Indexed、@FullTextField 和 @KeywordField,同时有几处差异和新增内容:
package org.acme.hibernate.search.elasticsearch.model;
import java.util.List;
import java.util.Objects;
import jakarta.persistence.CascadeType;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.OneToMany;
import org.hibernate.search.engine.backend.types.Sortable;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.IndexedEmbedded;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.KeywordField;
import io.quarkus.hibernate.orm.panache.PanacheEntity;
@Entity
@Indexed
public class Author extends PanacheEntity {
@FullTextField(analyzer = "name") (1)
@KeywordField(name = "firstName_sort", sortable = Sortable.YES, normalizer = "sort") (2)
public String firstName;
@FullTextField(analyzer = "name")
@KeywordField(name = "lastName_sort", sortable = Sortable.YES, normalizer = "sort")
public String lastName;
@OneToMany(mappedBy = "author", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
@IndexedEmbedded (3)
public List<Book> books;
// Preexisting equals()/hashCode() methods
}
- 与
Book类似,这里使用@FullTextField,但分析器不同;后文会说明。 - 同一属性可以定义多个索引字段。这里定义了具有特定名称的
@KeywordField。关键词字段不会分词,整个字符串保留为单个词元,但可以进行规范化,即过滤处理;后文会说明。由于要按作者排序,此字段标记为可排序。 @IndexedEmbedded将Book的字段纳入Author索引。这里采用默认配置:关联Book实体的所有字段都纳入索引,即title字段。借助双向关联,其中一本Book更新时,Hibernate Search 能自动重新索引其Author。
@IndexedEmbedded 也支持嵌套文档,使用 structure = NESTED 属性即可,但本例不需要。如果不希望嵌入所有字段,可使用 includePaths/excludePaths 指定嵌入父索引的字段。
分析器与规范化器
简介
文本分析是全文搜索的重要部分,决定在索引文本或构建搜索查询时如何处理文本。
分析器把文本拆分成词元,再执行过滤,例如转为小写、去除重音符号。规范化器是一类特殊的分析器,始终把输入保留为一个词元,尤其适合排序和关键词索引。系统自带许多分析器,也可以按特定需求开发自己的分析器。
更多信息参见 Elasticsearch 文档的文本分析部分。
定义所用的分析器
添加 Hibernate Search 注解时,已经指定了所用的分析器和规范化器,例如:
@FullTextField(analyzer = "english")
@FullTextField(analyzer = "name")
@KeywordField(name = "lastName_sort", sortable = Sortable.YES, normalizer = "sort")
本例使用:
name分析器处理人名。english分析器处理书名。sort规范化器处理排序字段。
不过这些组件尚未配置。下面介绍如何用 Hibernate Search 完成配置。
配置分析器
只需实现 ElasticsearchAnalysisConfigurer,再配置 Quarkus 使用该实现。针对本例需求,创建以下实现:
package org.acme.hibernate.search.elasticsearch.config;
import org.hibernate.search.backend.elasticsearch.analysis.ElasticsearchAnalysisConfigurationContext;
import org.hibernate.search.backend.elasticsearch.analysis.ElasticsearchAnalysisConfigurer;
import io.quarkus.hibernate.search.orm.elasticsearch.SearchExtension;
@SearchExtension (1)
public class AnalysisConfigurer implements ElasticsearchAnalysisConfigurer {
@Override
public void configure(ElasticsearchAnalysisConfigurationContext context) {
context.analyzer("name").custom() (2)
.tokenizer("standard")
.tokenFilters("asciifolding", "lowercase");
context.analyzer("english").custom() (3)
.tokenizer("standard")
.tokenFilters("asciifolding", "lowercase", "porter_stem");
context.normalizer("sort").custom() (4)
.tokenFilters("asciifolding", "lowercase");
}
}
- 在配置器实现上添加
@SearchExtension限定符,告诉 Quarkus 默认将其用于默认持久化单元的所有 Elasticsearch 索引。此注解也可指定持久化单元@SearchExtension(persistenceUnit = "nameOfYourPU")、后端@SearchExtension(backend = "nameOfYourBackend")、索引@SearchExtension(index = "nameOfYourIndex"),或其组合:@SearchExtension(persistenceUnit = "nameOfYourPU", backend = "nameOfYourBackend", index = "nameOfYourIndex")。 - 这是一个简单分析器:按空格分隔单词,把非 ASCII 字符替换为对应 ASCII 字符以去除重音,并全部转为小写。本例将它用于作者姓名。
- 此分析器处理得更积极,加入了词干提取:即使索引输入是
mysteries,搜索mystery也能命中。这种处理对人名过于激进,但适合书名。 - 排序规范化器与第一个分析器相似,但不进行分词,因为需要保留且只保留一个词元。
如果不能或不想用
@SearchExtension标记分析配置器,也可标记为@Dependent @Named("myAnalysisConfigurer"),然后通过配置属性引用:
quarkus.hibernate-search-orm.elasticsearch.analysis.configurer=bean:myAnalysisConfigurer
更多分析器配置说明参见参考文档对应章节。
为 REST 服务添加全文搜索
在已有的 LibraryResource 中注入 SearchSession:
@Inject
SearchSession searchSession; (1)
- 注入 Hibernate Search 会话;其底层依赖
EntityManager。有多个持久化单元时,可以用 CDI 限定符@io.quarkus.hibernate.orm.PersistenceUnit选择正确的单元,参见 CDI 集成。
实体上的注解已让它们可以进行全文搜索。现在添加下列方法及所需的 import,即可用 Hibernate Search DSL 查询索引:
@GET
@Path("author/search")
@Transactional (1)
public List<Author> searchAuthors(@RestQuery String pattern, (2)
@RestQuery Optional<Integer> size) {
return searchSession.search(Author.class) (3)
.where(f ->
pattern == null || pattern.trim().isEmpty() ?
f.matchAll() : (4)
f.simpleQueryString()
.fields("firstName", "lastName", "books.title").matching(pattern) (5)
)
.sort(f -> f.field("lastName_sort").then().field("firstName_sort")) (6)
.fetchHits(size.orElse(20)); (7)
}
- 此方法需要事务上下文。
- 使用
org.jboss.resteasy.reactive.RestQuery注解,避免重复写参数名。 - 指定搜索
Author。 - 创建谓词:模式为空时使用
matchAll()。 - 模式有效时,在
firstName、lastName和books.title字段上创建匹配该模式的simpleQueryString()谓词。 - 定义结果排序:先按姓氏,再按名字;使用此前专门创建的排序字段。
- 获取前
size条命中结果,默认20条;也支持分页。
Hibernate Search DSL 支持 Elasticsearch 谓词的一个很大子集,包括 match、range、nested、phrase、spatial 等。可以借助自动补全探索 DSL。如果仍不够用,也可以直接使用 JSON 定义谓词。
自动初始化数据
为演示导入一组初始数据。创建 src/main/resources/import.sql,写入以下内容,后续配置将引用它:
INSERT INTO author(id, firstname, lastname) VALUES (1, 'John', 'Irving');
INSERT INTO author(id, firstname, lastname) VALUES (2, 'Paul', 'Auster');
ALTER SEQUENCE author_seq RESTART WITH 3;
INSERT INTO book(id, title, author_id) VALUES (1, 'The World According to Garp', 1);
INSERT INTO book(id, title, author_id) VALUES (2, 'The Hotel New Hampshire', 1);
INSERT INTO book(id, title, author_id) VALUES (3, 'The Cider House Rules', 1);
INSERT INTO book(id, title, author_id) VALUES (4, 'A Prayer for Owen Meany', 1);
INSERT INTO book(id, title, author_id) VALUES (5, 'Last Night in Twisted River', 1);
INSERT INTO book(id, title, author_id) VALUES (6, 'In One Person', 1);
INSERT INTO book(id, title, author_id) VALUES (7, 'Avenue of Mysteries', 1);
INSERT INTO book(id, title, author_id) VALUES (8, 'The New York Trilogy', 2);
INSERT INTO book(id, title, author_id) VALUES (9, 'Mr. Vertigo', 2);
INSERT INTO book(id, title, author_id) VALUES (10, 'The Brooklyn Follies', 2);
INSERT INTO book(id, title, author_id) VALUES (11, 'Invisible', 2);
INSERT INTO book(id, title, author_id) VALUES (12, 'Sunset Park', 2);
INSERT INTO book(id, title, author_id) VALUES (13, '4 3 2 1', 2);
ALTER SEQUENCE book_seq RESTART WITH 14;
这些数据直接写入数据库,Hibernate Search 无法感知,因此不会被索引。之后通过 Hibernate ORM 操作产生的更新则会自动同步到全文索引。
在已有的 LibraryResource 中添加以下内容及所需的 import,为初始数据建立索引。
如果没有向数据库手工导入数据,就不需要此步骤。此时仅在更改索引配置,例如添加字段或修改分析器配置,并希望将新配置应用于已有数据时,才需要使用批量索引器。
@Inject
SearchMapping searchMapping; (1)
void onStart(@Observes StartupEvent ev) throws InterruptedException { (2)
// only reindex if we imported some content
if (Book.count() > 0) {
searchMapping.scope(Object.class) (3)
.massIndexer() (4)
.startAndWait(); (5)
}
}
- 注入底层依赖
EntityManagerFactory的 Hibernate SearchSearchMapping。多持久化单元应用可使用 CDI 限定符@io.quarkus.hibernate.orm.PersistenceUnit选择正确的单元,参见 CDI 集成。 - 添加应用启动时执行的方法。
- 创建搜索范围,包含所有继承
Object的已索引实体类型,即本例全部已索引实体Author和Book。 - 创建 Hibernate Search 批量索引器,高效索引大量数据;可以进一步调优以改善性能。
- 启动批量索引器并等待完成。
配置应用
所有配置都可放入 Quarkus 配置文件 application.properties。编辑 src/main/resources/application.properties:
quarkus.datasource.db-kind=postgresql (1)
quarkus.hibernate-orm.sql-load-script=import.sql (2)
quarkus.hibernate-search-orm.elasticsearch.version=9 (3)
quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy=sync (4)
%prod.quarkus.datasource.jdbc.url=jdbc:postgresql://localhost/quarkus_test
%prod.quarkus.datasource.username=quarkus_test
%prod.quarkus.datasource.password=quarkus_test
%prod.quarkus.hibernate-orm.schema-management.strategy=create
%prod.quarkus.hibernate-search-orm.elasticsearch.hosts=localhost:9200 (5)
- 创建 PostgreSQL 数据源。
- 启动时加载初始数据,参见自动初始化数据。
- 指定要使用的 Elasticsearch 版本。不同版本的映射语法存在明显差异,因此此配置很重要。为缩短启动时间,映射在构建时生成,Hibernate Search 不能连接集群来自动检测版本。使用 OpenSearch 时,版本须带
opensearch:前缀,参见 OpenSearch 兼容性。 - 写入完成之前,等待实体可被搜索。生产环境使用默认的
write-sync性能更好;测试需要实体立即可搜索,因此sync尤其重要。 - 开发和测试依靠 Dev Services 自动启动 PostgreSQL 数据库及 Elasticsearch 集群。生产模式需要手工启动它们,因此在
prod配置集(%prod.前缀)中提供连接信息。
由于使用 Dev Services,测试和开发模式下每次启动应用都会自动删除并重建数据库及 Elasticsearch 模式,除非显式设置
quarkus.hibernate-search-orm.schema-management.strategy。如果无法使用 Dev Services,可用以下配置取得类似行为:
%dev,test.quarkus.hibernate-orm.schema-management.strategy=drop-and-create
%dev,test.quarkus.hibernate-search-orm.schema-management.strategy=drop-and-create
另请参见 quarkus.hibernate-search-orm.schema-management.strategy。Hibernate Search ORM 扩展的更多配置见配置参考。
创建前端
添加一个简单网页与 LibraryResource 交互。Quarkus 自动提供 META-INF/resources 下的静态资源。在 src/main/resources/META-INF/resources 目录中,用该 index.html 文件的内容覆盖现有 index.html。
体验应用
现在可以与 REST 服务交互。
首先启动 Quarkus 应用。
CLI:
quarkus dev
Maven:
./mvnw quarkus:dev
Gradle:
./gradlew --console=plain quarkusDev
然后在浏览器中打开 http://localhost:8080/,搜索作者或书名;示例已经初始化了一些数据。也可以创建新作者和图书,再搜索它们。所有更新都会自动同步到 Elasticsearch 集群。
构建原生可执行文件
使用常规命令构建原生可执行文件。
CLI:
quarkus build --native
Maven:
./mvnw install -Dnative
Gradle:
./gradlew build -Dquarkus.native.enabled=true
原生可执行文件编译通常会消耗大量内存。构建期间先停止两个容器,构建后再启动,可能更稳妥。
运行 ./target/hibernate-search-orm-elasticsearch-quickstart-1.0.0-SNAPSHOT-runner 即可启动原生可执行文件,然后在浏览器中打开 http://localhost:8080/ 使用应用。
此示例启动比平时稍慢,主要因为每次启动都会删除并重建数据库模式及 Elasticsearch 映射,同时导入数据并运行批量索引器。实际应用显然不会在每次启动时执行这些操作。
Dev Services:免配置数据存储
Quarkus 的 Dev Services 功能可以免配置启动各种容器。
对于 Elasticsearch,此功能适用于默认连接。没有配置 quarkus.hibernate-search-orm.elasticsearch.hosts 时,Quarkus 会在测试或开发模式中自动启动 Elasticsearch 容器并配置连接。
生产版本仍须正常配置 Elasticsearch 连接。因此,如果既希望在 application.properties 中保留生产配置,又继续使用 Dev Services,Quarkus 文档作者建议使用 %prod. 配置集定义 Elasticsearch 设置。
Dev Services for Elasticsearch 目前不能同时启动多个集群,因此只适用于默认持久化单元的默认后端;命名持久化单元或命名后端无法使用该功能。
更多信息参见 Dev Services for Elasticsearch 指南。
编程式映射
如果无法向实体添加 Hibernate Search 注解,也可通过程序应用映射。映射配置器 HibernateOrmSearchMappingConfigurer 暴露的 ProgrammaticMappingConfigurationContext 用于配置编程式映射。
映射配置器不仅支持编程式映射,还可以配置注解映射、桥接器等。
示例如下:
package org.acme.hibernate.search.elasticsearch.config;
import org.hibernate.search.mapper.orm.mapping.HibernateOrmMappingConfigurationContext;
import org.hibernate.search.mapper.orm.mapping.HibernateOrmSearchMappingConfigurer;
import org.hibernate.search.mapper.pojo.mapping.definition.programmatic.TypeMappingStep;
import io.quarkus.hibernate.search.orm.elasticsearch.SearchExtension;
@SearchExtension (1)
public class CustomMappingConfigurer implements HibernateOrmSearchMappingConfigurer {
@Override
public void configure(HibernateOrmMappingConfigurationContext context) {
TypeMappingStep type = context.programmaticMapping() (2)
.type(SomeIndexedEntity.class); (3)
type.indexed() (4)
.index(SomeIndexedEntity.INDEX_NAME); (5)
type.property("id").documentId(); (6)
type.property("text").fullTextField(); (7)
}
}
- 用
@SearchExtension限定符标记配置器实现,让默认持久化单元中的 Hibernate Search 使用它。也可通过@SearchExtension(persistenceUnit = "nameOfYourPU")指定持久化单元。 - 获取编程式映射上下文。
- 为
SomeIndexedEntity实体创建映射步骤。 - 将
SomeIndexedEntity定义为已索引实体。 - 指定该实体使用的索引名称。
- 定义文档 ID 属性。
- 为
text属性定义全文搜索字段。
如果不能或不想使用
@SearchExtension,可改用@Dependent @Named("myMappingConfigurer"),再从配置属性中引用:
quarkus.hibernate-search-orm.mapping.configurer=bean:myMappingConfigurer
OpenSearch 兼容性
Hibernate Search 同时兼容 Elasticsearch 和 OpenSearch,但默认假定连接的是 Elasticsearch 集群。
要使用 OpenSearch,为配置的版本添加 opensearch: 前缀:
quarkus.hibernate-search-orm.elasticsearch.version=opensearch:3.5
其他配置选项及 API 与 Elasticsearch 完全相同。有关兼容的 Elasticsearch 发行版及版本,参见 Hibernate Search 参考文档对应章节。
多个持久化单元
配置多个持久化单元
Hibernate ORM 扩展允许配置多个持久化单元,各自拥有数据源及配置。如果声明多个持久化单元,也要分别配置 Hibernate Search。
quarkus.hibernate-search-orm. 命名空间根部的属性定义默认持久化单元。以下示例定义默认数据源及默认持久化单元,并将其 Elasticsearch 主机设为 es1.mycompany.com:9200:
quarkus.datasource.db-kind=h2
quarkus.datasource.jdbc.url=jdbc:h2:mem:default;DB_CLOSE_DELAY=-1
quarkus.hibernate-search-orm.elasticsearch.hosts=es1.mycompany.com:9200
quarkus.hibernate-search-orm.elasticsearch.version=9
也可通过映射式配置定义命名持久化单元:
quarkus.datasource."users".db-kind=h2 (1)
quarkus.datasource."users".jdbc.url=jdbc:h2:mem:users;DB_CLOSE_DELAY=-1
quarkus.datasource."inventory".db-kind=h2 (2)
quarkus.datasource."inventory".jdbc.url=jdbc:h2:mem:inventory;DB_CLOSE_DELAY=-1
quarkus.hibernate-orm."users".datasource=users (3)
quarkus.hibernate-orm."users".packages=org.acme.model.user
quarkus.hibernate-orm."inventory".datasource=inventory (4)
quarkus.hibernate-orm."inventory".packages=org.acme.model.inventory
quarkus.hibernate-search-orm."users".elasticsearch.hosts=es1.mycompany.com:9200 (5)
quarkus.hibernate-search-orm."users".elasticsearch.version=9
quarkus.hibernate-search-orm."inventory".elasticsearch.hosts=es2.mycompany.com:9200 (6)
quarkus.hibernate-search-orm."inventory".elasticsearch.version=9
- 定义名为
users的数据源。 - 定义名为
inventory的数据源。 - 定义
users持久化单元,指向users数据源。 - 定义
inventory持久化单元,指向inventory数据源。 - 配置
users持久化单元的 Hibernate Search,Elasticsearch 主机为es1.mycompany.com:9200。 - 配置
inventory持久化单元的 Hibernate Search,Elasticsearch 主机为es2.mycompany.com:9200。
将模型类关联到持久化单元
对于每个持久化单元,Hibernate Search 只考虑关联到该单元的已索引实体。通过配置 Hibernate ORM 扩展将实体关联到持久化单元。
CDI 集成
注入入口对象
可以通过 CDI 注入 Hibernate Search 的主要入口 SearchSession 和 SearchMapping:
@Inject
SearchSession searchSession;
这将注入默认持久化单元的 SearchSession。要注入命名持久化单元(本例为 users)的 SearchSession,添加限定符:
@Inject
@PersistenceUnit("users") (1)
SearchSession searchSession;
- 此处使用
@io.quarkus.hibernate.orm.PersistenceUnit注解。
以相同方式注入命名持久化单元的 SearchMapping:
@Inject
@PersistenceUnit("users")
SearchMapping searchMapping;
接入自定义组件
Quarkus 的 Hibernate Search with Hibernate ORM 扩展会自动向 Hibernate Search 注入带 @SearchExtension 注解的组件。
在组件类型支持的情况下,注解可指定持久化单元 @SearchExtension(persistenceUnit = "nameOfYourPU")、后端 @SearchExtension(backend = "nameOfYourBackend")、索引 @SearchExtension(index = "nameOfYourIndex"),或其组合:@SearchExtension(persistenceUnit = "nameOfYourPU", backend = "nameOfYourBackend", index = "nameOfYourIndex")。
此功能支持以下组件:
| 组件类型 | 用途与作用范围 |
|---|---|
org.hibernate.search.engine.reporting.FailureHandler |
后台进程发生任何失败时应收到通知的组件,主要涉及索引操作。每个持久化单元一个。参见参考文档对应章节。 |
org.hibernate.search.mapper.orm.mapping.HibernateOrmSearchMappingConfigurer |
配置 Hibernate Search 映射,尤其是编程式映射。每个持久化单元一个或多个。参见编程式映射。 |
org.hibernate.search.mapper.pojo.work.IndexingPlanSynchronizationStrategy |
配置应用线程与索引操作之间的同步方式。每个持久化单元一个。也可通过 quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy 选择内置实现。参见参考文档对应章节。 |
org.hibernate.search.backend.elasticsearch.analysis.ElasticsearchAnalysisConfigurer |
配置全文分析,例如分析器和规范化器。每个后端一个或多个。参见配置分析器。 |
org.hibernate.search.backend.elasticsearch.index.layout.IndexLayoutStrategy |
配置 Elasticsearch 布局,包括索引名称、索引别名等。每个后端一个。也可通过 quarkus.hibernate-search-orm.elasticsearch.layout.strategy 选择内置实现。参见参考文档对应章节。 |
激活或停用 Hibernate Search
如果某个持久化单元在构建时已配置 Hibernate Search 索引,Hibernate Search 默认在该单元中处于激活状态,并随应用启动。
运行时将 quarkus.hibernate-search-orm-elasticsearch[.optional name].active 设为 false,可停用给定持久化单元中的 Hibernate Search。其行为类似 Hibernate ORM 扩展对应功能,但作用于 Hibernate Search bean。
离线启动
默认情况下,Hibernate Search 启动时会向 Elasticsearch 集群发送少量请求。如果集群此时尚未运行,应用可能启动失败。
可通过以下配置禁止启动时发送请求:
- 将
quarkus.hibernate-search-orm.elasticsearch.version-check.enabled设为false,停用启动时的 Elasticsearch 版本检查。 - 将
quarkus.hibernate-search-orm.schema-management.strategy设为none,停用启动时的模式管理。
即便如此,在 Elasticsearch 集群可访问之前,Hibernate Search 仍无法建立索引或执行搜索查询。
将
quarkus.hibernate-search-orm.schema-management.strategy设为none以停用自动模式创建后,必须在应用开始持久化/更新实体及执行搜索之前,手工创建模式。参见参考文档对应章节。
通过 outbox 轮询协调
outbox 轮询协调功能处于预览阶段,不保证向后兼容,也不保证会持续保留在生态系统中。某些改进可能需要更改配置、API,甚至存储格式;团队正在推进稳定化。可通过邮件列表或 GitHub issue 跟踪器反馈意见。
技术上可以在分布式应用中使用 Hibernate Search 和 Elasticsearch,但默认存在一些限制,原因是 Hibernate Search 默认不在线程或应用节点之间执行协调。
要消除这些限制,可使用 outbox-polling 协调策略。此策略在数据库中创建 outbox 表,写入实体变更事件,再由后台处理器消费事件并建立索引。
启用该策略需要额外扩展。
CLI:
quarkus extension add hibernate-search-orm-outbox-polling
Maven:
./mvnw quarkus:add-extension -Dextensions='hibernate-search-orm-outbox-polling'
Gradle:
./gradlew addExtension --extensions='hibernate-search-orm-outbox-polling'
安装扩展后,将 quarkus.hibernate-search-orm.coordination.strategy 设为 outbox-polling,显式选择策略。
还须确保 Hibernate Search 添加的 Hibernate ORM 实体(表示 outbox 及 agent)在数据库中具有对应表和序列:
- 如果应用刚开始开发,计划让 Hibernate ORM 生成数据库模式,生成的模式会包含 Hibernate Search 所需实体。
- 否则须手工修改模式,添加必要的表和序列。
可以通过以下属性自定义 outbox-polling 协调所需的数据库模式:
quarkus.hibernate-search-orm.coordination.entity-mapping.agent.catalogquarkus.hibernate-search-orm.coordination.entity-mapping.agent.schemaquarkus.hibernate-search-orm.coordination.entity-mapping.agent.tablequarkus.hibernate-search-orm.coordination.entity-mapping.agent.uuid-gen-strategyquarkus.hibernate-search-orm.coordination.entity-mapping.agent.uuid-typequarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.catalogquarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.schemaquarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.tablequarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.uuid-gen-strategyquarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.uuid-type
完成这些设置后,无须修改代码,直接启动应用。应用会自动检测是否有多个应用连接同一数据库,并据此协调索引更新。
outbox-polling下的 Hibernate Search 大体保持原有行为,持久化实体、搜索等应用代码通常无须修改。主要差别是索引更新必然异步:保证最终发生,但不保证立即发生。因此不能设置quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy;Hibernate Search 始终表现为使用默认的write-sync。此行为与 Elasticsearch 的近实时搜索一致,也是即使未启用协调时的推荐使用方式。
协调机制的详情参见参考文档对应章节;相关配置见outbox 轮询协调配置。
AWS 请求签名
Amazon 托管的 Elasticsearch 服务要求一种涉及请求签名的专有认证方式。可向项目添加专门扩展并配置,以在 Hibernate Search 中启用 AWS 请求签名。
更多信息参见 Hibernate Search ORM + Elasticsearch AWS 扩展文档。
管理端点
Hibernate Search 管理端点处于预览阶段,不保证向后兼容,也不保证会持续保留在生态系统中。某些改进可能需要更改配置、API,甚至存储格式;团队正在推进稳定化。可通过邮件列表或 GitHub issue 跟踪器反馈意见。
Hibernate Search 扩展通过管理接口提供用于重新索引数据的 HTTP 端点。默认不可用,可通过以下属性启用:
quarkus.management.enabled=true (1)
quarkus.hibernate-search-orm.management.enabled=true (2)
- 启用管理接口。
- 启用 Hibernate Search 专用管理端点。
启用后,可通过 /q/hibernate-search/reindex 重新索引数据。/q 是默认管理根路径,/hibernate-search 是默认 Hibernate Search 管理根路径,后者可配置:
quarkus.hibernate-search-orm.management.root-path=custom-root-path (1)
- 使用自定义
custom-root-path。若采用默认管理根路径,重新索引路径变为/q/custom-root-path/reindex。
此端点只接受内容类型为 application/json 的 POST 请求。请求体为空时,会重新索引所有已索引实体。若只需重新索引部分实体,或需自定义底层批量索引器配置,可在请求体中传入:
{
"filter": {
"types": ["EntityName1", "EntityName2", "EntityName3", ...], (1)
},
"massIndexer":{
"typesToIndexInParallel": 1, (2)
}
}
- 需要重新索引的实体名称数组;未指定或为空时,重新索引所有实体类型。
- 并行索引的实体类型数。
所有可用过滤条件及批量索引器配置如下:
{
"filter": { (1)
"types": ["EntityName1", "EntityName2", "EntityName3", ...], (2)
"tenants": ["tenant1", "tenant2", ...] (3)
},
"massIndexer":{ (4)
"typesToIndexInParallel": 1, (5)
"threadsToLoadObjects": 6, (6)
"batchSizeToLoadObjects": 10, (7)
"cacheMode": "IGNORE", (8)
"mergeSegmentsOnFinish": false, (9)
"mergeSegmentsAfterPurge": true, (10)
"dropAndCreateSchemaOnStart": false, (11)
"purgeAllOnStart": true, (12)
"idFetchSize": 100, (13)
"transactionTimeout": 100000, (14)
}
}
- 过滤对象,用于限定重新索引范围。
- 实体名称数组;未指定或为空时,重新索引所有实体类型。
- 多租户场景的租户 ID 数组;未指定或为空时,重新索引所有租户。
- 批量索引器配置对象。
- 并行索引的实体类型数。
- 加载根实体所用的线程数。
- 加载根实体的批大小。
- 数据加载任务与缓存交互的模式。
- 索引完成后是否将每个索引合并为一个分段。
- 初始清空索引之后、开始索引之前,是否将每个索引合并为一个分段。
- 索引前是否删除并重建已有索引及其模式。
- 索引前是否从索引中删除所有实体。
- 加载待索引对象的主键时使用的提取大小。
- 加载待重新索引的 ID 和实体时,事务的超时。JSON 中的所有属性均为可选,只需使用需要的属性。
批量索引器配置详情参见 Hibernate Search 参考文档对应章节。
提交重新索引请求会触发后台索引,进度显示在应用日志中。测试时可能需要知道何时完成;在 URL 中添加 wait_for=finished 查询参数,管理端点就会返回分块响应,分别报告索引开始和完成。
多个持久化单元场景可通过 persistence_unit 查询参数指定要重新索引的单元:/q/hibernate-search/reindex?persistence_unit=non-default-persistence-unit。
延伸阅读
Hibernate 团队发布了详尽的 Hibernate Search 参考文档,并维护列出其他相关资源的页面。
常见问题
为什么只支持 Elasticsearch?
Hibernate Search 同时支持 Lucene 后端和 Elasticsearch 后端。Quarkus 团队认为,在 Quarkus 中构建可扩展应用时,后者更合适,因此将精力集中在后者。
团队目前没有在 Quarkus 中支持 Lucene 后端的计划,不过 Quarkiverse 中有一个 issue 跟踪相关实现:quarkiverse/quarkus-hibernate-search-extras#179。
Hibernate Search with Hibernate ORM 配置参考
主要配置
原文以锁定标记表示构建时固定的属性,其他属性可在运行时覆盖。下表保留配置项及其全部命名变体、环境变量、类型和默认值;具体构建时标记请参阅官方配置表。
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.enabled构建时是否启用 Hibernate Search。若构建时停用,将跳过全部相关处理,运行时也不能重新激活: quarkus.hibernate-search-orm.active 默认变为 false,设为 true 会报错。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ENABLED |
boolean | true |
quarkus.hibernate-search-orm.background-failure-handlerquarkus.hibernate-search-orm."persistence-unit-name".background-failure-handlerbean 引用,指定后台进程(主要是索引操作)发生任何失败时接收通知的组件,须实现 FailureHandler。参见参考文档。也可以不设置此属性,而在自定义实现上加 @SearchExtension,让 Hibernate Search 自动使用它,参见自定义组件。显式属性优先于注解。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_BACKGROUND_FAILURE_HANDLER |
string | |
quarkus.hibernate-search-orm.coordination.strategyquarkus.hibernate-search-orm."persistence-unit-name".coordination.strategy协调线程及不同应用实例的策略,尤其用于自动索引。参见协调机制。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_STRATEGY |
string | none |
quarkus.hibernate-search-orm.mapping.configurerquarkus.hibernate-search-orm."persistence-unit-name".mapping.configurer一个或多个bean 引用,指定配置 Hibernate Search 映射、尤其是编程式映射的组件,须实现 HibernateOrmSearchMappingConfigurer。参见编程式映射。也可不设置此属性,而为自定义实现添加 @SearchExtension,由 Hibernate Search 自动使用;参见自定义组件。显式属性优先于注解。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_MAPPING_CONFIGURER |
list of string | |
quarkus.hibernate-search-orm.activequarkus.hibernate-search-orm."persistence-unit-name".active运行时是否在此持久化单元激活 Hibernate Search。未激活时,不会索引 Hibernate ORM 实体,也不能访问该单元的 SearchMapping/SearchSession 执行搜索或其他操作。若 quarkus.hibernate-search-orm.enabled=false,所有持久化单元均无法激活,设置此属性为 true 会失败。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ACTIVE |
boolean | Hibernate Search 已启用且持久化单元激活时为 true,否则为 false |
quarkus.hibernate-search-orm.schema-management.strategyquarkus.hibernate-search-orm."persistence-unit-name".schema-management.strategy模式管理策略,控制启动和关闭时如何创建、更新、验证或删除索引及其模式。全部策略及行为见后面的“模式管理策略”表。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_SCHEMA_MANAGEMENT_STRATEGY |
none, validate, create, create-or-validate, create-or-update, drop-and-create, drop-and-create-and-drop |
使用 Dev Services 时为 drop-and-create-and-drop,否则为 create-or-validate |
模式管理策略
| 策略 | 行为 |
|---|---|
none |
不执行操作;假定索引已存在,且模式符合 Hibernate Search 的预期。 |
validate |
验证索引存在且模式符合预期;不符合时抛出异常,不尝试修复。 |
create |
索引不存在时创建索引及模式;已存在时不执行操作,假定模式符合预期。 |
create-or-validate |
未使用 Dev Services 时的默认值。不存在时创建索引及模式;已存在时验证模式,不符合时抛出异常,不尝试修复。 |
create-or-update |
不存在时创建索引及模式;已存在时验证模式,不符合时尝试更新。受若干重要限制影响,不适用于生产环境,但开发期间可能有用。 |
drop-and-create |
不存在时创建索引及模式;已存在时先删除,再创建索引及模式。 |
drop-and-create-and-drop |
使用 Dev Services 时的默认值。启动时按 drop-and-create 处理,关闭时还会删除索引及模式。 |
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.query.loading.cache-lookup.strategyquarkus.hibernate-search-orm."persistence-unit-name".query.loading.cache-lookup.strategy执行搜索查询并加载实体时,采用的缓存查找策略。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_QUERY_LOADING_CACHE_LOOKUP_STRATEGY |
skip, persistence-context, persistence-context-then-second-level-cache |
skip |
quarkus.hibernate-search-orm.query.loading.fetch-sizequarkus.hibernate-search-orm."persistence-unit-name".query.loading.fetch-size执行搜索查询并加载实体时使用的提取大小。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_QUERY_LOADING_FETCH_SIZE |
int | 100 |
quarkus.hibernate-search-orm.indexing.plan.synchronization.strategyquarkus.hibernate-search-orm."persistence-unit-name".indexing.plan.synchronization.strategy应用线程与索引之间的同步方式,既用于实体变更时由隐式监听器触发的索引,也用于显式 SearchIndexingPlan。它决定数据库事务提交后,索引完成到什么程度才恢复应用线程。仅在停用协调(默认状态)时有意义;outbox-polling 在后台线程中异步索引,行为等价于 write-sync。全部策略、吞吐量和保证见后面的“索引同步策略”表。也接受自定义 IndexingPlanSynchronizationStrategy 的bean 引用,参见参考文档。或者不设置属性,而将实现标为 @SearchExtension 以便自动使用;参见自定义组件。显式属性优先于注解。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_INDEXING_PLAN_SYNCHRONIZATION_STRATEGY |
string | write-sync |
索引同步策略
下表说明应用线程恢复时的保证。保证项依据原文链接的 Hibernate Search 官方参考表以文字列出。
| 策略 | 吞吐量 | 变更已应用 | 崩溃/断电后变更仍安全 | 搜索可见 |
|---|---|---|---|---|
async |
最佳 | 不保证 | 不保证 | 不保证 |
write-sync(默认) |
中等 | 保证 | 保证 | 不保证 |
read-sync |
中等至最差 | 保证 | 不保证 | 保证 |
sync |
最差 | 保证 | 保证 | 保证 |
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.multi-tenancy.tenant-idsquarkus.hibernate-search-orm."persistence-unit-name".multi-tenancy.tenant-ids启用多租户时,应用可能使用的全部租户标识符列表。主要适用于 outbox-polling 协调策略,因为该策略需要为每个租户设置后台处理器。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_MULTI_TENANCY_TENANT_IDS |
list of string | |
quarkus.hibernate-search-orm.automatic-indexing.synchronization.strategyquarkus.hibernate-search-orm."persistence-unit-name".automatic-indexing.synchronization.strategy已弃用:请改用 quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy。此属性指定自动索引时的同步策略。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_AUTOMATIC_INDEXING_SYNCHRONIZATION_STRATEGY |
string | write-sync |
quarkus.hibernate-search-orm.automatic-indexing.enable-dirty-checkquarkus.hibernate-search-orm."persistence-unit-name".automatic-indexing.enable-dirty-check已弃用,且没有替代属性。将来判断是否触发重新索引时将始终执行脏检查。此属性控制实际重新索引实体之前,是否检查脏属性与索引是否相关。启用后,如果仅更改了索引未使用的属性,将跳过该实体的重新索引。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_AUTOMATIC_INDEXING_ENABLE_DIRTY_CHECK |
boolean | true |
Elasticsearch/OpenSearch 后端配置
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.elasticsearch.versionquarkus.hibernate-search-orm.elasticsearch."backend-name".versionquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.versionquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".version集群使用的 Elasticsearch 版本。模式在未连接服务器时生成,因此此项必填。无须精确到完整版本,例如可用 7 或 7.1,但必须足够精确,确保生成模式的模型方言与和 Elasticsearch 通信的协议方言兼容。没有统一经验规则,因为是否兼容取决于不同 Elasticsearch 版本引入的模式差异;发生问题时,Hibernate Search 连接集群会报错。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_VERSION |
ElasticsearchVersion | |
quarkus.hibernate-search-orm.elasticsearch.schema-management.settings-filequarkus.hibernate-search-orm.elasticsearch."backend-name".schema-management.settings-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.schema-management.settings-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".schema-management.settings-file类路径中包含自定义索引设置的文件路径;创建 Elasticsearch 索引时会将其纳入索引定义。设置将与 Hibernate Search 生成的设置合并,包括分析器定义。如果同时通过分析配置器和自定义设置配置文本分析,其行为未定义,不应依赖。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_SCHEMA_MANAGEMENT_SETTINGS_FILE |
string | |
quarkus.hibernate-search-orm.elasticsearch.schema-management.mapping-filequarkus.hibernate-search-orm.elasticsearch."backend-name".schema-management.mapping-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.schema-management.mapping-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".schema-management.mapping-file类路径中包含自定义索引映射的文件路径,创建 Elasticsearch 索引时将其纳入索引定义。文件无须、通常也不应包含完整映射;Hibernate Search 会自动补入缺失的属性,即索引字段。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_SCHEMA_MANAGEMENT_MAPPING_FILE |
string | |
quarkus.hibernate-search-orm.elasticsearch.analysis.configurerquarkus.hibernate-search-orm.elasticsearch."backend-name".analysis.configurerquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.analysis.configurerquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".analysis.configurer一个或多个bean 引用,指定配置全文分析(例如分析器、规范化器)的组件。须实现 ElasticsearchAnalysisConfigurer,参见配置分析器。也可不设置此属性,而为实现添加 @SearchExtension,Hibernate Search 会自动使用它;参见自定义组件。显式属性优先于注解。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_ANALYSIS_CONFIGURER |
list of string | |
quarkus.hibernate-search-orm.elasticsearch.hostsquarkus.hibernate-search-orm.elasticsearch."backend-name".hostsquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.hostsquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".hostsElasticsearch 服务器主机列表。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_HOSTS |
list of string | localhost:9200 |
quarkus.hibernate-search-orm.elasticsearch.protocolquarkus.hibernate-search-orm.elasticsearch."backend-name".protocolquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.protocolquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".protocol联系 Elasticsearch 服务器时使用的协议。设为 https 可启用 SSL/TLS;http 使用明文 HTTP,停用 SSL/TLS。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_PROTOCOL |
http使用明文 HTTP,停用 SSL/TLS。, https使用 HTTPS,启用 SSL/TLS。 |
http使用明文 HTTP,停用 SSL/TLS。 |
quarkus.hibernate-search-orm.elasticsearch.usernamequarkus.hibernate-search-orm.elasticsearch."backend-name".usernamequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.usernamequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".username认证所用的用户名。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_USERNAME |
string | |
quarkus.hibernate-search-orm.elasticsearch.passwordquarkus.hibernate-search-orm.elasticsearch."backend-name".passwordquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.passwordquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".password认证所用的密码。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_PASSWORD |
string | |
quarkus.hibernate-search-orm.elasticsearch.connection-timeoutquarkus.hibernate-search-orm.elasticsearch."backend-name".connection-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.connection-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".connection-timeout建立到 Elasticsearch 服务器连接时的超时。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_CONNECTION_TIMEOUT |
Duration | 1S |
quarkus.hibernate-search-orm.elasticsearch.read-timeoutquarkus.hibernate-search-orm.elasticsearch."backend-name".read-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.read-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".read-timeout读取 Elasticsearch 服务器响应时的超时。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_READ_TIMEOUT |
Duration | 30S |
quarkus.hibernate-search-orm.elasticsearch.request-timeoutquarkus.hibernate-search-orm.elasticsearch."backend-name".request-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.request-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".request-timeout执行 Elasticsearch 请求的超时,包括等待可用连接、发送请求及读取响应所需的时间。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_REQUEST_TIMEOUT |
Duration | |
quarkus.hibernate-search-orm.elasticsearch.max-connectionsquarkus.hibernate-search-orm.elasticsearch."backend-name".max-connectionsquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.max-connectionsquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".max-connections连接所有 Elasticsearch 服务器的最大连接数。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_MAX_CONNECTIONS |
int | 40 |
quarkus.hibernate-search-orm.elasticsearch.max-connections-per-routequarkus.hibernate-search-orm.elasticsearch."backend-name".max-connections-per-routequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.max-connections-per-routequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".max-connections-per-route连接每台 Elasticsearch 服务器的最大连接数。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_MAX_CONNECTIONS_PER_ROUTE |
int | 20 |
quarkus.hibernate-search-orm.elasticsearch.discovery.enabledquarkus.hibernate-search-orm.elasticsearch."backend-name".discovery.enabledquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.discovery.enabledquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".discovery.enabled是否启用自动发现。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_DISCOVERY_ENABLED |
boolean | false |
quarkus.hibernate-search-orm.elasticsearch.discovery.refresh-intervalquarkus.hibernate-search-orm.elasticsearch."backend-name".discovery.refresh-intervalquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.discovery.refresh-intervalquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".discovery.refresh-interval节点列表的刷新间隔。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_DISCOVERY_REFRESH_INTERVAL |
Duration | 10S |
quarkus.hibernate-search-orm.elasticsearch.thread-pool.sizequarkus.hibernate-search-orm.elasticsearch."backend-name".thread-pool.sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.thread-pool.sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".thread-pool.size分配给后端的线程池大小。此数量按后端计算,不按索引计算,增加索引不会增加线程。线程池内所有操作都非阻塞,超过 JVM 可用处理器核数不会带来明显性能收益。调整此项的理由通常是减少线程:例如单索引、单索引队列的应用运行在64核机器上时,可考虑减小线程数。默认值为 JVM 启动时可用的处理器核数。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_THREAD_POOL_SIZE |
int | |
quarkus.hibernate-search-orm.elasticsearch.query.shard-failure.ignorequarkus.hibernate-search-orm.elasticsearch."backend-name".query.shard-failure.ignorequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.query.shard-failure.ignorequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".query.shard-failure.ignore是否忽略部分分片失败: true 表示忽略;false 表示 Hibernate Search 抛出异常。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_QUERY_SHARD_FAILURE_IGNORE |
boolean | false |
quarkus.hibernate-search-orm.elasticsearch.version-check.enabledquarkus.hibernate-search-orm.elasticsearch."backend-name".version-check.enabledquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.version-check.enabledquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".version-check.enabled启动时是否检查 Elasticsearch 集群版本。如果集群启动时可能不可用,设为 false。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_VERSION_CHECK_ENABLED |
boolean | true |
quarkus.hibernate-search-orm.elasticsearch.schema-management.required-statusquarkus.hibernate-search-orm.elasticsearch."backend-name".schema-management.required-statusquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.schema-management.required-statusquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".schema-management.required-status启动时要求的最低 Elasticsearch 集群状态。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_SCHEMA_MANAGEMENT_REQUIRED_STATUS |
green, yellow, red |
yellow |
quarkus.hibernate-search-orm.elasticsearch.schema-management.required-status-wait-timeoutquarkus.hibernate-search-orm.elasticsearch."backend-name".schema-management.required-status-wait-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.schema-management.required-status-wait-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".schema-management.required-status-wait-timeout等待所需状态的最长时间,超时后启动失败。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_SCHEMA_MANAGEMENT_REQUIRED_STATUS_WAIT_TIMEOUT |
Duration | 10S |
quarkus.hibernate-search-orm.elasticsearch.indexing.queue-countquarkus.hibernate-search-orm.elasticsearch."backend-name".indexing.queue-countquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexing.queue-countquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexing.queue-count分配给每个索引的索引队列数。较大的值会增加并行连接,可能提高索引吞吐量,但也可能导致 Elasticsearch 过载,例如 HTTP 请求缓冲区溢出或触发熔断器,使 Elasticsearch 放弃部分请求并导致索引失败。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXING_QUEUE_COUNT |
int | 10 |
quarkus.hibernate-search-orm.elasticsearch.indexing.queue-sizequarkus.hibernate-search-orm.elasticsearch."backend-name".indexing.queue-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexing.queue-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexing.queue-size索引队列的大小。较小的值可能降低内存使用量,尤其是队列很多时;但太小会降低达到最大批量请求大小的概率,提高队列满时应用线程阻塞的概率,进而降低索引吞吐量。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXING_QUEUE_SIZE |
int | 1000 |
quarkus.hibernate-search-orm.elasticsearch.indexing.max-bulk-sizequarkus.hibernate-search-orm.elasticsearch."backend-name".indexing.max-bulk-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexing.max-bulk-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexing.max-bulk-size处理索引队列时创建的批量请求的最大大小。较大的值会在每个 HTTP 请求中向 Elasticsearch 发送更多文档,可能提高索引吞吐量,但也可能造成 Elasticsearch 过载,例如 HTTP 请求缓冲区溢出或触发熔断器,使服务器放弃请求并导致索引失败。超过队列大小的值不会生效,因为批量请求不能包含多于队列容量的请求。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXING_MAX_BULK_SIZE |
int | 100 |
quarkus.hibernate-search-orm.elasticsearch.layout.strategyquarkus.hibernate-search-orm.elasticsearch."backend-name".layout.strategyquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.layout.strategyquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".layout.strategybean 引用,指定 Elasticsearch 布局(索引名、索引别名等)配置组件,须实现 IndexLayoutStrategy。内置 simple 是默认且面向未来的策略:Hibernate Search 索引名为 myIndex 时,创建索引 myindex-000001,写别名 myindex-write,读别名 myindex-read。内置 no-alias 不使用别名,主要适用于旧集群:同样的索引名会创建 myindex,不创建任何别名。参见参考文档。也可不设置此属性,而将自定义实现标为 @SearchExtension,让 Hibernate Search 自动使用;参见自定义组件。显式属性优先于注解。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_LAYOUT_STRATEGY |
string |
按索引覆盖配置
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".schema-management.settings-filequarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".schema-management.settings-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".schema-management.settings-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".schema-management.settings-file类路径中包含自定义索引设置的文件路径;创建 Elasticsearch 索引时会将其纳入索引定义。设置将与 Hibernate Search 生成的设置合并,包括分析器定义。如果同时通过分析配置器和自定义设置配置文本分析,其行为未定义,不应依赖。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__SCHEMA_MANAGEMENT_SETTINGS_FILE |
string | |
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".schema-management.mapping-filequarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".schema-management.mapping-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".schema-management.mapping-filequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".schema-management.mapping-file类路径中包含自定义索引映射的文件路径,创建 Elasticsearch 索引时将其纳入索引定义。文件无须、通常也不应包含完整映射;Hibernate Search 会自动补入缺失的属性,即索引字段。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__SCHEMA_MANAGEMENT_MAPPING_FILE |
string | |
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".analysis.configurerquarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".analysis.configurerquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".analysis.configurerquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".analysis.configurer一个或多个bean 引用,指定配置全文分析(例如分析器、规范化器)的组件。须实现 ElasticsearchAnalysisConfigurer,参见配置分析器。也可不设置此属性,而为实现添加 @SearchExtension,Hibernate Search 会自动使用它;参见自定义组件。显式属性优先于注解。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__ANALYSIS_CONFIGURER |
list of string | |
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".schema-management.required-statusquarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".schema-management.required-statusquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".schema-management.required-statusquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".schema-management.required-status启动时要求的最低 Elasticsearch 集群状态。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__SCHEMA_MANAGEMENT_REQUIRED_STATUS |
green, yellow, red |
yellow |
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".schema-management.required-status-wait-timeoutquarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".schema-management.required-status-wait-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".schema-management.required-status-wait-timeoutquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".schema-management.required-status-wait-timeout等待所需状态的最长时间,超时后启动失败。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__SCHEMA_MANAGEMENT_REQUIRED_STATUS_WAIT_TIMEOUT |
Duration | 10S |
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".indexing.queue-countquarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".indexing.queue-countquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".indexing.queue-countquarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".indexing.queue-count分配给每个索引的索引队列数。较大的值会增加并行连接,可能提高索引吞吐量,但也可能导致 Elasticsearch 过载,例如 HTTP 请求缓冲区溢出或触发熔断器,使 Elasticsearch 放弃部分请求并导致索引失败。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__INDEXING_QUEUE_COUNT |
int | 10 |
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".indexing.queue-sizequarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".indexing.queue-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".indexing.queue-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".indexing.queue-size索引队列的大小。较小的值可能降低内存使用量,尤其是队列很多时;但太小会降低达到最大批量请求大小的概率,提高队列满时应用线程阻塞的概率,进而降低索引吞吐量。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__INDEXING_QUEUE_SIZE |
int | 1000 |
quarkus.hibernate-search-orm.elasticsearch.indexes."index-name".indexing.max-bulk-sizequarkus.hibernate-search-orm.elasticsearch."backend-name".indexes."index-name".indexing.max-bulk-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch.indexes."index-name".indexing.max-bulk-sizequarkus.hibernate-search-orm."persistence-unit-name".elasticsearch."backend-name".indexes."index-name".indexing.max-bulk-size处理索引队列时创建的批量请求的最大大小。较大的值会在每个 HTTP 请求中向 Elasticsearch 发送更多文档,可能提高索引吞吐量,但也可能造成 Elasticsearch 过载,例如 HTTP 请求缓冲区溢出或触发熔断器,使服务器放弃请求并导致索引失败。超过队列大小的值不会生效,因为批量请求不能包含多于队列容量的请求。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_ELASTICSEARCH_INDEXES__INDEX_NAME__INDEXING_MAX_BULK_SIZE |
int | 100 |
管理接口
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.management.root-path重新索引端点的根路径。此值作为相对于 ${quarkus.management.root-path} 的路径解析。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_MANAGEMENT_ROOT_PATH |
string | hibernate-search/ |
quarkus.hibernate-search-orm.management.enabled启用管理接口后,重新索引端点会发布在管理接口下。将此属性设为 true 可启用该功能。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_MANAGEMENT_ENABLED |
boolean | false |
Duration 格式
时间长度使用标准 java.time.Duration 格式,参见 Duration#parse() Java API 文档。也支持以数字开头的简写:
- 只有数字时表示秒。
- 数字后跟
ms时表示毫秒。 - 其他情况先转换为
java.time.Duration格式再解析:数字后跟h、m或s时加PT前缀,后跟d时加P前缀。
bean 引用
通过配置属性引用 bean 是可选方式,原文作者并不推荐;给 bean 添加 @SearchExtension 可达到相同效果,参见自定义组件。
如果确实希望在配置属性中用字符串引用 bean,该字符串会被解析,常用格式包括:
bean:后跟@NamedCDI bean 的名称,例如bean:myBean。class:后跟类的全限定名称;若该类是 CDI bean,通过 CDI 实例化,否则调用公开无参构造器。例如class:com.mycompany.MyClass。- 引用内置实现的字符串。可用值见各属性文档,例如
quarkus.hibernate-search-orm.indexing.plan.synchronization.strategy的async/read-sync/write-sync/sync。
也接受其他格式,但只对高级用例有用,参见 Hibernate Search 参考文档对应章节。
outbox 轮询协调配置
以下配置项需要额外扩展,参见通过 outbox 轮询协调。
原文以锁定标记表示构建时固定的属性,其他属性可在运行时覆盖;具体标记请参阅官方配置表。
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.coordination.event-processor.enabledquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.enabled是否启用事件处理器,即是否在此应用实例上处理事件并执行自动重新索引。可在部分节点上设为 false,例如让部分节点专门处理 HTTP 请求,其他节点专门处理事件。参见参考文档。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_ENABLED |
boolean | true |
quarkus.hibernate-search-orm.coordination.event-processor.shards.total-countquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.shards.total-count将待处理实体变更事件划分为分区的分片总数。默认动态分片,无须设置。若要显式控制分片数及分配,须使用静态分片,并同时设置此项及已分配分片( shards.assigned)。参见事件处理器分片说明。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_SHARDS_TOTAL_COUNT |
int | |
quarkus.hibernate-search-orm.coordination.event-processor.shards.assignedquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.shards.assigned将实体变更事件划分为分区后,由此应用实例处理的分片。默认动态分片,无须设置。显式控制分片数和分配时,须配置静态分片,同时设置此项及分片总数。分片索引范围为 [0, total_count - 1],参见 shards.total-count。每个应用节点至少分配一个分片,也可用逗号分隔列表,例如 0,3,分配多个分片。参见事件处理器分片说明。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_SHARDS_ASSIGNED |
list of int | |
quarkus.hibernate-search-orm.coordination.event-processor.polling-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.polling-interval查询 outbox 事件表未返回事件后,再次查询前的等待时间。较小的值缩短变更反映到索引的时间,但在没有新事件时增加数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_POLLING_INTERVAL |
Duration | 0.100S |
quarkus.hibernate-search-orm.coordination.event-processor.pulse-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.pulse-interval事件处理器持续轮询事件多久后,必须发送一次 pulse,更新并检查 agents 表中的注册信息。pulse 间隔必须介于轮询间隔与过期间隔的三分之一之间。较小的值(接近轮询间隔)减少节点加入或离开集群时停止处理事件的时间,降低因误判处理器离线而浪费处理时间的风险,但更频繁检查 agent 列表会增加数据库压力。较大的值(接近过期间隔)增加上述停止处理时间和误判风险,但降低数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_PULSE_INTERVAL |
Duration | 2S |
quarkus.hibernate-search-orm.coordination.event-processor.pulse-expirationquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.pulse-expiration事件处理器一次 pulse 的有效期,超过后将被视为离线并强制移出集群。过期间隔至少为 pulse 间隔的3倍。较小的值(接近 pulse 间隔)缩短节点因崩溃或网络故障突然离开后停止处理事件的时间,但增加误判离线而浪费处理时间的风险。较大的值(远大于 pulse 间隔)增加突然离线后的停止处理时间,但降低误判风险。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_PULSE_EXPIRATION |
Duration | 30S |
quarkus.hibernate-search-orm.coordination.event-processor.batch-sizequarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.batch-size单个事务最多处理的 outbox 事件数。较大的值减少后台进程开启的事务数,并可能借助一级缓存(持久化上下文)提高性能,但会增加内存使用,极端情况下可能导致 OutOfMemoryError。参见参考文档。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_BATCH_SIZE |
int | 50 |
quarkus.hibernate-search-orm.coordination.event-processor.transaction-timeoutquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.transaction-timeout处理 outbox 事件的事务超时。未设置时,使用 JTA 事务管理器的默认事务超时;该值可能过低,导致批量事件处理事务超时。发生这种情况时,应通过此属性设置更大的超时。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_TRANSACTION_TIMEOUT |
Duration | |
quarkus.hibernate-search-orm.coordination.event-processor.retry-delayquarkus.hibernate-search-orm."persistence-unit-name".coordination.event-processor.retry-delay事件上次处理失败后,再次处理前必须等待的时间。设为 0S 表示尽快重试,不额外延迟。参见参考文档。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_EVENT_PROCESSOR_RETRY_DELAY |
Duration | 30S |
quarkus.hibernate-search-orm.coordination.mass-indexer.polling-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.mass-indexer.polling-interval批量索引器主动等待事件处理器自行暂停时,再次查询 agent 表前的等待时间。较小的值缩短发现事件处理器已经暂停的时间,但在主动等待时增加数据库压力;较大的值延长发现时间,但降低数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_MASS_INDEXER_POLLING_INTERVAL |
Duration | 0.100S |
quarkus.hibernate-search-orm.coordination.mass-indexer.pulse-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.mass-indexer.pulse-interval批量索引器可以等待多久,然后必须发送一次 pulse,更新并检查 agent 表中的注册信息。间隔必须介于轮询间隔和过期间隔的三分之一之间。较小的值(接近轮询间隔)降低批量索引器 agent 被误判离线,导致事件处理器在批量索引期间恢复处理的风险,但更频繁更新 agent 条目会增加数据库压力。较大的值(接近过期间隔)增加上述风险,但降低数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_MASS_INDEXER_PULSE_INTERVAL |
Duration | 2S |
quarkus.hibernate-search-orm.coordination.mass-indexer.pulse-expirationquarkus.hibernate-search-orm."persistence-unit-name".coordination.mass-indexer.pulse-expiration事件处理器 pulse 在被视为离线并强制移出集群之前的有效期。过期间隔至少为 pulse 间隔的3倍。较小的值(接近 pulse 间隔)缩短批量索引器 agent 崩溃退出后事件处理器停止处理的时间,但增加 agent 被误判离线、事件处理器在批量索引期间提前恢复的风险。较大的值(远大于 pulse 间隔)增加 agent 崩溃后的停止处理时间,但降低误判导致提前恢复的风险。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_MASS_INDEXER_PULSE_EXPIRATION |
Duration | 30S |
持久化单元配置
outbox-polling 协调实体映射
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.coordination.entity-mapping.agent.catalogquarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.agent.catalogagent 表使用的数据库 catalog。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_AGENT_CATALOG |
string | Hibernate ORM 配置的默认 catalog |
quarkus.hibernate-search-orm.coordination.entity-mapping.agent.schemaquarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.agent.schemaagent 表使用的 schema catalog。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_AGENT_SCHEMA |
string | Hibernate ORM 配置的默认 catalog |
quarkus.hibernate-search-orm.coordination.entity-mapping.agent.tablequarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.agent.tableagent 表名称。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_AGENT_TABLE |
string | HSEARCH_AGENT |
quarkus.hibernate-search-orm.coordination.entity-mapping.agent.uuid-gen-strategyquarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.agent.uuid-gen-strategyagent 表使用的 UUID 生成策略: auto(默认)等同于 random,使用 UUID#randomUUID();time 是符合 IETF RFC 4122 的基于 IP 的策略。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_AGENT_UUID_GEN_STRATEGY |
auto, random, time |
auto |
quarkus.hibernate-search-orm.coordination.entity-mapping.agent.uuid-typequarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.agent.uuid-type在 outbox 事件表中表示 UUID 的 Hibernate ORM 基本类型名称。可用表示形式参见 Hibernate ORM 文档。默认特殊值为 default,根据数据库类型解析为 char 或 binary。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_AGENT_UUID_TYPE |
string | 根据数据库类型选择 char/binary |
quarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.catalogquarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.outbox-event.catalogoutbox 事件表使用的数据库 catalog。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_OUTBOX_EVENT_CATALOG |
string | Hibernate ORM 配置的默认 catalog |
quarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.schemaquarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.outbox-event.schemaoutbox 事件表使用的 schema catalog。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_OUTBOX_EVENT_SCHEMA |
string | Hibernate ORM 配置的默认 schema |
quarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.tablequarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.outbox-event.tableoutbox 事件表名称。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_OUTBOX_EVENT_TABLE |
string | HSEARCH_OUTBOX_EVENT |
quarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.uuid-gen-strategyquarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.outbox-event.uuid-gen-strategyoutbox 事件表使用的 UUID 生成策略: auto(默认)等同于 random,使用 UUID#randomUUID();time 是符合 IETF RFC 4122 的基于 IP 的策略。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_OUTBOX_EVENT_UUID_GEN_STRATEGY |
auto, random, time |
auto |
quarkus.hibernate-search-orm.coordination.entity-mapping.outbox-event.uuid-typequarkus.hibernate-search-orm."persistence-unit-name".coordination.entity-mapping.outbox-event.uuid-type在 outbox 事件表中表示 UUID 的 Hibernate ORM 基本类型名称。可用表示形式参见 Hibernate ORM 文档。默认特殊值为 default,根据数据库类型解析为 char 或 binary。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_ENTITY_MAPPING_OUTBOX_EVENT_UUID_TYPE |
string | 根据数据库类型选择 char/binary |
按租户覆盖配置
| 配置属性及说明 | 类型 | 默认值 |
|---|---|---|
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.enabledquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.enabled是否启用事件处理器,即是否在此应用实例上处理事件并执行自动重新索引。可在部分节点上设为 false,例如让部分节点专门处理 HTTP 请求,其他节点专门处理事件。参见参考文档。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_ENABLED |
boolean | true |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.shards.total-countquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.shards.total-count将待处理实体变更事件划分为分区的分片总数。默认动态分片,无须设置。若要显式控制分片数及分配,须使用静态分片,并同时设置此项及已分配分片( shards.assigned)。参见事件处理器分片说明。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_SHARDS_TOTAL_COUNT |
int | |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.shards.assignedquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.shards.assigned将实体变更事件划分为分区后,由此应用实例处理的分片。默认动态分片,无须设置。显式控制分片数和分配时,须配置静态分片,同时设置此项及分片总数。分片索引范围为 [0, total_count - 1],参见 shards.total-count。每个应用节点至少分配一个分片,也可用逗号分隔列表,例如 0,3,分配多个分片。参见事件处理器分片说明。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_SHARDS_ASSIGNED |
list of int | |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.polling-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.polling-interval查询 outbox 事件表未返回事件后,再次查询前的等待时间。较小的值缩短变更反映到索引的时间,但在没有新事件时增加数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_POLLING_INTERVAL |
Duration | 0.100S |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.pulse-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.pulse-interval事件处理器持续轮询事件多久后,必须发送一次 pulse,更新并检查 agents 表中的注册信息。pulse 间隔必须介于轮询间隔与过期间隔的三分之一之间。较小的值(接近轮询间隔)减少节点加入或离开集群时停止处理事件的时间,降低因误判处理器离线而浪费处理时间的风险,但更频繁检查 agent 列表会增加数据库压力。较大的值(接近过期间隔)增加上述停止处理时间和误判风险,但降低数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_PULSE_INTERVAL |
Duration | 2S |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.pulse-expirationquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.pulse-expiration事件处理器一次 pulse 的有效期,超过后将被视为离线并强制移出集群。过期间隔至少为 pulse 间隔的3倍。较小的值(接近 pulse 间隔)缩短节点因崩溃或网络故障突然离开后停止处理事件的时间,但增加误判离线而浪费处理时间的风险。较大的值(远大于 pulse 间隔)增加突然离线后的停止处理时间,但降低误判风险。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_PULSE_EXPIRATION |
Duration | 30S |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.batch-sizequarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.batch-size单个事务最多处理的 outbox 事件数。较大的值减少后台进程开启的事务数,并可能借助一级缓存(持久化上下文)提高性能,但会增加内存使用,极端情况下可能导致 OutOfMemoryError。参见参考文档。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_BATCH_SIZE |
int | 50 |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.transaction-timeoutquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.transaction-timeout处理 outbox 事件的事务超时。未设置时,使用 JTA 事务管理器的默认事务超时;该值可能过低,导致批量事件处理事务超时。发生这种情况时,应通过此属性设置更大的超时。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_TRANSACTION_TIMEOUT |
Duration | |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".event-processor.retry-delayquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".event-processor.retry-delay事件上次处理失败后,再次处理前必须等待的时间。设为 0S 表示尽快重试,不额外延迟。参见参考文档。环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__EVENT_PROCESSOR_RETRY_DELAY |
Duration | 30S |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".mass-indexer.polling-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".mass-indexer.polling-interval批量索引器主动等待事件处理器自行暂停时,再次查询 agent 表前的等待时间。较小的值缩短发现事件处理器已经暂停的时间,但在主动等待时增加数据库压力;较大的值延长发现时间,但降低数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__MASS_INDEXER_POLLING_INTERVAL |
Duration | 0.100S |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".mass-indexer.pulse-intervalquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".mass-indexer.pulse-interval批量索引器可以等待多久,然后必须发送一次 pulse,更新并检查 agent 表中的注册信息。间隔必须介于轮询间隔和过期间隔的三分之一之间。较小的值(接近轮询间隔)降低批量索引器 agent 被误判离线,导致事件处理器在批量索引期间恢复处理的风险,但更频繁更新 agent 条目会增加数据库压力。较大的值(接近过期间隔)增加上述风险,但降低数据库压力。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__MASS_INDEXER_PULSE_INTERVAL |
Duration | 2S |
quarkus.hibernate-search-orm.coordination.tenants."tenant-id".mass-indexer.pulse-expirationquarkus.hibernate-search-orm."persistence-unit-name".coordination.tenants."tenant-id".mass-indexer.pulse-expiration事件处理器 pulse 在被视为离线并强制移出集群之前的有效期。过期间隔至少为 pulse 间隔的3倍。较小的值(接近 pulse 间隔)缩短批量索引器 agent 崩溃退出后事件处理器停止处理的时间,但增加 agent 被误判离线、事件处理器在批量索引期间提前恢复的风险。较大的值(远大于 pulse 间隔)增加 agent 崩溃后的停止处理时间,但降低误判导致提前恢复的风险。参见参考文档。 环境变量: QUARKUS_HIBERNATE_SEARCH_ORM_COORDINATION_TENANTS__TENANT_ID__MASS_INDEXER_PULSE_EXPIRATION |
Duration | 30S |
Duration 格式
时间长度使用标准 java.time.Duration 格式,参见 Duration#parse() Java API 文档。也支持以数字开头的简写:
- 只有数字时表示秒。
- 数字后跟
ms时表示毫秒。 - 其他情况先转换为
java.time.Duration格式再解析:数字后跟h、m或s时加PT前缀,后跟d时加P前缀。
来源、许可与修改说明
原文:Use Hibernate Search with Hibernate ORM and Elasticsearch/OpenSearch。原作者:Quarkus 项目及文档贡献者。中文译文:未完纪。依据2026年10月3日读取的 Latest 版本页面翻译;示例使用 Quarkus 3.40.1、Elasticsearch 9 和 OpenSearch 3.5。
原文网站页脚及官方网站仓库说明将网站内容按 Creative Commons Attribution 3.0 Unported(CC BY 3.0)提供。本译文按该许可提供,保留来源署名、许可链接及变更说明;不表示 Quarkus 项目认可或背书本译文。原文另说明项目依赖采用 Apache Software License 2.0 或兼容许可;该说明与本网站内容的 CC BY 3.0 许可分别适用。
本版将正文、操作说明及完整配置参考译为中文,保留全部代码展示和代码中的编号标注;表格重新排版,链接改为绝对地址,部分链接采用官方读取结果中的页面地址。索引同步保证表依据原文链接的 Hibernate Search 官方参考表转为文字;配置表的构建时锁定标记以原网页为准。文中的建议和技术取舍归属于原文作者,示例输出和效果说明属于原文描述。











暂无评论内容