如何在 Hibernate Search 5.10 中部分重建索引?
How to partially rebuild index in Hibernate Search 5.10?
我正在做一个需要使用 Hibernate Search 的项目,我只会索引一个实体,它映射到一个巨大的 table 中,有近 2000 万条记录,而且每天都会添加更多记录它但不是通过我正在处理的应用程序和实体管理器,休眠搜索无法自动索引新更改。问题是每天为实体重建整个索引需要很长时间。
我想知道有什么方法可以保留我当前的索引并为新的更改部分重建索引文档?
如果在一天结束时,您能够根据数据库中的信息列出过去 24 小时内修改过的所有实体(每个实体的最后一次更改 date/time ,例如),那么是的,有办法做到这一点。
首先,您可以 "manually" 通过 运行 您自己的 Hibernate ORM 查询并在您希望重新索引的每个元素上调用 FullTextSession.index
来实现。如果要重新索引大量元素,则必须分批执行此操作,最好为每批打开一个事务。
另一个更好的选择是使用已知有效的 JSR352 integration, which will however require you to use a JSR352-compatible runtime (Spring Batch is not very standard-compliant and won't work; JBeret)。通过以单个实体为目标并在构建参数时调用 restrictedBy(Criterion)
,您将能够限制要重建索引的实体列表。
例如:
Properties jobProperties = MassIndexingJob.parameters()
.forEntity( MyClass.class )
.restrictedBy( Restrictions.ge( "lastChangeDateTime", LocalDate.now().minus( 26, ChronoUnit.HOURS ) ) // 26 to account for DST switch and other slight delays
.build();
long executionId = BatchRuntime.getJobOperator()
.start( MassIndexingJob.NAME, jobProperties );
MassIndexer
unfortunately doesn't offer such feature yet. You can vote for the feature on ticket HSEARCH-499 并在评论中解释您的用例:我们将尝试优先考虑使许多用户受益的功能。当然,您可以随时联系我们讨论如何实现它并贡献一个补丁 :)
我正在做一个需要使用 Hibernate Search 的项目,我只会索引一个实体,它映射到一个巨大的 table 中,有近 2000 万条记录,而且每天都会添加更多记录它但不是通过我正在处理的应用程序和实体管理器,休眠搜索无法自动索引新更改。问题是每天为实体重建整个索引需要很长时间。
我想知道有什么方法可以保留我当前的索引并为新的更改部分重建索引文档?
如果在一天结束时,您能够根据数据库中的信息列出过去 24 小时内修改过的所有实体(每个实体的最后一次更改 date/time ,例如),那么是的,有办法做到这一点。
首先,您可以 "manually" 通过 运行 您自己的 Hibernate ORM 查询并在您希望重新索引的每个元素上调用 FullTextSession.index
来实现。如果要重新索引大量元素,则必须分批执行此操作,最好为每批打开一个事务。
另一个更好的选择是使用已知有效的 JSR352 integration, which will however require you to use a JSR352-compatible runtime (Spring Batch is not very standard-compliant and won't work; JBeret)。通过以单个实体为目标并在构建参数时调用 restrictedBy(Criterion)
,您将能够限制要重建索引的实体列表。
例如:
Properties jobProperties = MassIndexingJob.parameters()
.forEntity( MyClass.class )
.restrictedBy( Restrictions.ge( "lastChangeDateTime", LocalDate.now().minus( 26, ChronoUnit.HOURS ) ) // 26 to account for DST switch and other slight delays
.build();
long executionId = BatchRuntime.getJobOperator()
.start( MassIndexingJob.NAME, jobProperties );
MassIndexer
unfortunately doesn't offer such feature yet. You can vote for the feature on ticket HSEARCH-499 并在评论中解释您的用例:我们将尝试优先考虑使许多用户受益的功能。当然,您可以随时联系我们讨论如何实现它并贡献一个补丁 :)