Hibernate Search 是一个库,通过自动索引实体与 Apache Lucene 或 Elasticsearch 集成 Hibernate ORM,实现高级搜索功能:全文搜索、地理空间搜索、聚合等。更多详细信息,请参阅 hibernate.org 上的 Hibernate Search。

最初由 Mincong Huang 在 Google Summer of Code 项目中启动,Hibernate Search 5.9 将集成 JSR 352,即 "Java 平台的批处理应用程序"。这种集成提供了一个新的大量索引(索引大量实体)实现,作为一个 JSR 352 作业。

昨天我们发布了 5.9.0.Beta1,您可以尝试一下!

为什么它很好用?如何使用它?让我们来了解一下!

什么是 JSR 352?

"JSR 352:Java 平台的批处理应用程序" 是一个规范,定义了执行批处理过程("作业")的接口和机制,即反复对大量项目应用相同操作的进程。

在 JSR 352 中

  • 作业定义由一个 XML 文件和几个 Java 类提供,称为批处理工件。在我们的例子中,定义由 Hibernate Search 提供。

  • JSR 352 运行时通过管理线程、事务、执行流程(在批处理工件上调用方法)等来避免样板代码...

  • 剩下的只是配置基础设施。在我们的例子中,这是您的责任,作为 Hibernate Search 的用户。

它与现有的大量索引器相比有何优势?

您是否曾经尝试使用现有的大量索引器重新索引 100,000 个实体,但在第 99,001 个实体处遇到一些网络或磁盘错误?然后您必须从头开始重新启动,即使前 99,000 个实体索引得很好...

使用JSR 352的大规模索引作业,作业将从最后一个检查点恢复,可能在第95,000个实体左右。

还有其他优点(例如能够在多个不相关的后台作业之间共享资源),但真正使我们认为JSR 352有意义的原因是这个。

如何使用JSR 352的大规模索引作业?

设置

在Wildfly 11中,使用我们的JBoss模块,配置Hibernate ORM和Hibernate Search。为了使您的应用程序能够访问Hibernate Search的大规模索引作业,请在您的部署中添加对org.hibernate.search.jsr352模块的依赖项,并导入元信息,例如,通过在您的应用程序的META-INF/MANIFEST.MF文件中指定以下内容:Dependencies: org.hibernate.search.jsr352 meta-inf。就是这样:然后您可以通过CDI注入在您的应用程序中检索javax.batch.operations.JobOperator实例。

在Java SE应用程序中,您可以使用JSR 352的参考实现,JBatch,在Java SE模式下使用。您需要在您的项目中添加以下依赖项

  • 在您的项目中添加以下依赖项

    • org.hibernate:hibernate-search-jsr352-core:5.9.0.Beta1

    • com.ibm.jbatch:com.ibm.jbatch-runtime:1.0

    • javax.batch:javax.batch-api:1.0

    • javax.inject:javax.inject:1

    • org.apache.derby:derby:10.13.1.1

  • META-INF/services下添加配置文件,

  • 通过调用javax.batch.runtime.BatchRuntime.getJobOperator()在您的应用程序中检索JobOperator(请确保存储结果,因为每次调用都可能创建一个新的操作员)。

  • 在尝试启动大规模索引作业之前,请确保初始化Hibernate ORM,并在最后一个大规模索引作业停止后关闭它。

您还可以在Java SE模式下使用JBeret

  • 在您的项目中添加对org.hibernate:hibernate-search-jsr352-jberet:5.9.0.Beta1的依赖项

  • 按照JBeret文档中的说明设置您的项目

  • 通过调用javax.batch.runtime.BatchRuntime.getJobOperator()在您的应用程序中检索JobOperator(请确保存储结果,因为每次调用都可能创建一个新的操作员)。

  • 在尝试启动大规模索引作业之前,请确保初始化Hibernate ORM,并在最后一个大规模索引作业停止后关闭它。

至于其他JSR 352运行时,大规模索引器可能正常工作也可能不正常。我们正在测试至少另一个Java EE应用程序服务器和Spring Batch:请参见下面的当前限制和进一步工作

用法

以下所有示例都假设变量jobOperator包含上述说明中检索到的作业操作员。

要启动大规模索引作业

java.util.Properties parameters = org.hibernate.search.jsr352.massindexing.MassIndexingJob.parameters()
                .forEntities( MyFirstEntity.class, MySecondEntity.class )
                .build();
long executionId = jobOperator.start(
                org.hibernate.search.jsr352.massindexing.MassIndexingJob.NAME,
                parameters
                );

您可以通过此调用查询执行状态

javax.batch.runtime.JobExecution jobExecution = jobOperator.getJobExecution( executionId );

您可以通过这种方式暂停作业

long executionId2 = jobOperator.stop( executionId );

要暂停后或失败后恢复作业,您可以这样请求重启

long executionId2 = jobOperator.restart( executionId, parameters );

根据JSR 352规范,在重启作业时必须再次提供参数。

但是,JBeret,Wildfly中包含的JSR 352实现,允许您传递null,并将它解释为“我在最初启动作业时使用的参数”。

从调用MassIndexingJob.parameters()获得的构建器提供了一些设置。以下是一些最有用的

  • .purgeAllOnStart(boolean):指定是否应在作业开始时清除现有索引。

  • .restrictedBy(Criterion):使用Criterion仅索引实体子集。

  • .restrictedBy(String):使用HQL仅索引实体子集。请注意,当使用HQL时,作业将切换到降级模式,该模式存在几个限制,使其仅适用于小型、快速执行。有关详细信息,请参阅文档

有关作业参数、如何调整性能或如何处理依赖于多个JPA持久单元的应用程序的更多信息,请参阅文档

性能

我们进行了一些基准测试,根据我们的观察,JSR 352的大规模索引作业的性能与现有的大规模索引器相当。

然而,请注意,性能很大程度上取决于您的配置,您可能需要调整作业参数以实现最佳性能,具体请参阅文档中的说明。

当前限制和后续工作

目前,Hibernate Search JSR 352集成仅被证明与两种JSR 352运行时一起工作:独立模式下的JBatch和WildFly服务器中的JBeret。

我们希望确保我们的大规模索引作业能够与其他Java EE应用程序服务器一起工作,并希望与Spring自己的Spring Batch项目一起工作,该项目对JSR 352的支持有限。

在此期间……请记住,我们已经发布了5.9.0.Beta1,因此您现在就可以尝试!有关如何获取新版本的信息,请参阅hibernate.org

无论如何,欢迎您联系我们,无论是有任何问题、问题,还是简单地给我们提供反馈!


回到顶部