【问题标题】:How to partially rebuild index in Hibernate Search 5.10?如何在 Hibernate Search 5.10 中部分重建索引?
【发布时间】:2018-07-09 17:20:16
【问题描述】:
我正在做一个项目,我需要使用 Hibernate Search,并且我将只索引一个实体,它被映射到一个包含近 2000 万条记录的巨大表中,并且每天将添加更多记录,但不是通过应用程序我正在处理的实体管理器和休眠搜索无法自动索引新更改。问题是每天为实体重建整个索引需要很长时间。
我想知道有什么方法可以保留我当前的索引并部分重建索引文档以进行新的更改?
【问题讨论】:
标签:
java
hibernate
elasticsearch
lucene
hibernate-search
【解决方案1】:
如果在一天结束时,您能够根据数据库中的信息(例如,每个实体的最后更改日期/时间)列出过去 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 上为该功能投票,并在评论中解释您的用例:我们将尝试优先考虑使许多用户受益的功能。当然,您可以随时与我们联系,讨论如何实现这一点并提供补丁:)