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
不能用于仅索引部分数据...yet。 IdentifierProducer
是一个内部 class,您不应该尝试更改它。
您可以做的是 运行 查询以列出受导入影响的实体,并要求 Hibernate Search 重新索引它们,例如以 20 个元素为一组。您可以从 this example from the documentation 中获得一些灵感。当然,在您的情况下,您将向 Hibernate ORM 查询添加过滤器,以仅通过因导入而实际更改的实体。
不要忘记删除您的索引拦截器,它应该不再有用了。
我有一个巨大的 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
不能用于仅索引部分数据...yet。 IdentifierProducer
是一个内部 class,您不应该尝试更改它。
您可以做的是 运行 查询以列出受导入影响的实体,并要求 Hibernate Search 重新索引它们,例如以 20 个元素为一组。您可以从 this example from the documentation 中获得一些灵感。当然,在您的情况下,您将向 Hibernate ORM 查询添加过滤器,以仅通过因导入而实际更改的实体。
不要忘记删除您的索引拦截器,它应该不再有用了。