【问题标题】:Hibernate Search: Indexing only a few entites of a huge table without loading all entriesHibernate Search:只索引一个巨大表的几个实体而不加载所有条目
【发布时间】:2020-10-01 11:13:21
【问题描述】:

我有一个巨大的表,我使用 Hibernate Search 版本 5.11.5 将其写入 Lucene 索引。将(现有)原始 SQL 导入此表后,我必须手动更新搜索索引。此 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;
   }
}

此代码有效,但重新索引需要很长时间,因为所有实体都已加载。只有

我看到在 Hibernate Search 的深处存在一个类 IdentifierProducer,它在方法 loadAllIdentifiers 中加载所有 ID。我很想在内部条件中添加一个 SQL 过滤器 - 例如“修改位置 > :given_date”。

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

问候

【问题讨论】:

    标签: hibernate-search


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢这个伟大的提示!您的示例按预期对我有用。
    • @yrodiere 你好!我现在处于同样的情况,我发现可以使用 JSR-352 集成对 repos 进行自定义查询(以便进行部分重新索引)。我做了这个改变,现在我得到了我的自定义查询重新索引的实体,但它不会合并受影响的文档,它只是重写整个索引。因此,我得到的不是 15 个文档,而是 2 个,其他文档被删除。是否可以在此过程中添加一些“合并”? (我的意思是更新我通过自定义查询提取的文档)// Spring Boot 2,Hibernate Search 6 CR2。
    • @Artemoon 你好。您可以通过将purgeAllOnStart 设置为false 来禁用索引的初始清除。见docs.jboss.org/hibernate/search/6.0/reference/en-US/html_single/…。通过这样做,已从数据库中删除的文档将保留在索引中。您需要手动删除它们。
    • @yrodiere,谢谢!这正是我所需要的,就像一个魅力!我今天看到了这个参数,但没有尝试将其设置为用于测试目的。我什至学会了如何使用SearchIndexingPlan 并手动更新文档......所以是的,在下一步中,我将尝试结合这两种方法并在 Hibernate Search 的帮助下使用我们的自定义查询更新文档并通过 @ 删除它们我想是 987654329@ 方法。
    猜你喜欢
    • 2011-11-20
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多