休眠搜索:在不加载所有条目的情况下仅索引巨大表的几个实体

问题描述

我有一个巨大的表,使用Hibernate Search版本5.11.5将其写入Lucene索引。将(现有)原始sql导入此表后,我必须手动更新搜索索引。该sql导入一天要运行多次,并且重新编制索引不应将传入的搜索请求阻止超过几秒钟。

在每个实体上都有一个修改过”的日期字段,因此我已经用EntityIndexingInterceptor对该@Indexed Entity进行了注释,如下所示:

public class CustomEntityIndexingInterceptor implements EntityIndexingInterceptor<HugeTableEntity> {
   public static Date lastModified = //some logic;

   @Override
   public IndexingOverride onAdd(HugeTableEntity entity) {
      return IndexingOverride.APPLY_DEFAULT;
   }

   @Override
   public IndexingOverride onUpdate(HugeTableEntity entity) {
      if (entity.getModified().after(lastModified)) {
         return IndexingOverride.APPLY_DEFAULT;
      }
      return IndexingOverride.SKIP;
   }
}

代码有效,但是由于所有实体都已加载,因此重新索引会花费大量时间。只有

我看到在Hibernate Search的深处存在一个IdentifierProducer类,该类在loadAllIdentifiers方法中加载所有ID。我想在内部条件中添加一个sql过滤器-类似于“ where where>> given_date”。

您知道我是否可以在不复制所有代码的情况下自定义IdentifierProducer吗?您知道解决我的问题的另一种聪明方法吗?

致谢

解决方法

MassIndexer不能仅用于索引部分数据... yetIdentifierProducer是一个内部类,您不应尝试对其进行更改。

您可以做的是运行一个查询以列出受导入影响的实体,然后让Hibernate Search重新索引它们的索引,例如按20个元素的批次。您可以从this example from the documentation中汲取灵感。当然,对于您的情况,您将向Hibernate ORM查询添加过滤器,以仅通过由于导入而实际更改的实体。

别忘了删除索引拦截器,它不再有用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...