代码之家  ›  专栏  ›  技术社区  ›  Reza Shirin Nezhad

如何在HibernateSearch5.10中部分重建索引?

  •  0
  • Reza Shirin Nezhad  · 技术社区  · 6 年前

    我正在做一个项目,我需要使用hibernate搜索,我将只索引一个实体,它被映射到一个有近2000万条记录的大表中,每天将有更多的记录添加到其中,但不是通过我正在处理的应用程序和实体管理器,hibernate搜索无法自动索引新的更改。问题是每天为实体重建整个索引需要很长时间。
    我想知道是否有任何方法可以保留当前索引并部分地重新生成索引文档以进行新的更改?

    1 回复  |  直到 6 年前
        1
  •  0
  •   yrodiere    6 年前

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

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

    另一个更好的选择是使用 JSR352 integration ,但这将要求您使用与jsr352兼容的运行时(spring批处理不太符合标准,无法工作; 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 并在评论中解释您的用例:我们将尝试对有利于许多用户的特性进行优先排序。当然,您可以随时联系我们讨论如何实现此功能并提供修补程序:)