Hibernate Search:仅索引巨大 table 中的几个实体而不加载所有条目

Hibernate Search: Indexing only a few entites of a huge table without loading all entries

我有一个巨大的 table,我使用 Hibernate Search Version 5.11.5 将其写入 Lucene 索引。在(现有的)原始 SQL 导入此 table 之后,我必须手动更新搜索索引。此 SQL 导入每天运行多次,重建索引不应阻止传入的搜索请求超过几秒钟。

在每个实体上都有一个日期字段“已修改”,所以我已经用 EntityIndexingInterceptor 注释了这个@Indexed 实体,如下所示:

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;
   }
}

此代码有效,但重建索引需要花费大量时间,因为所有实体都已加载。只有<0.001%符合修改日期的条件。

我看到在 Hibernate Search 的深处有一个 class IdentifierProducer,它在 loadAllIdentifiers 方法中加载所有 ID。我很想在内部标准中添加一个 SQL 过滤器 - 比如“where modified > :given_date”.

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

此致

MassIndexer 不能用于仅索引部分数据...yetIdentifierProducer 是一个内部 class,您不应该尝试更改它。

您可以做的是 运行 查询以列出受导入影响的实体,并要求 Hibernate Search 重新索引它们,例如以 20 个元素为一组。您可以从 this example from the documentation 中获得一些灵感。当然,在您的情况下,您将向 Hibernate ORM 查询添加过滤器,以仅通过因导入而实际更改的实体。

不要忘记删除您的索引拦截器,它应该不再有用了。