如何在Hibernate Search 5.10中部分重建索引?

时间:2018-07-09 17:20:16

标签: java hibernate elasticsearch lucene hibernate-search

我正在一个需要使用Hibernate Search的项目中,并且我将仅索引一个实体,它映射到一个具有近2000万条记录的庞大表中,并且每天将向其中添加更多记录,但不是通过应用程序我正在处理的实体管理器和休眠搜索无法自动索引新更改。问题是每天为实体重建整个索引将花费很长时间。
我想知道有什么方法可以保留我的当前索引并为新的更改而部分重建索引文档吗?

1 个答案:

答案 0 :(得分:0)

如果一天结束时您能够基于数据库中的信息列出最近24小时内已修改的所有实体(例如,每个实体的最后更改日期/时间) ,那么是的,有很多方法可以做到这一点。

首先,您可以通过运行自己的Hibernate ORM查询并在要查看重新索引的每个元素上调用FullTextSession.index来“手动”完成操作。如果您有大量要重新编制索引的元素,则必须分批执行此操作,最好为每个批次打开一个事务。

另一个更好的选择是使用JSR352 integration,但是这将要求您使用JSR352兼容的运行时(Spring Batch不是非常符合标准,因此将无法正常工作; 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还没有提供此功能。您可以在ticket HSEARCH-499上对该功能进行投票,并在评论中说明您的用例:我们将优先考虑使许多用户受益的功能。当然,您可以随时与我们联系,讨论如何实现此功能并提供补丁:)