Hibernate搜索';MassIndexer API的条件索引工作?
我在其中一个实体类上使用带条件索引的Hibernate搜索。该实体的Hibernate搜索';MassIndexer API的条件索引工作?,hibernate,lucene,hibernate-search,Hibernate,Lucene,Hibernate Search,我在其中一个实体类上使用带条件索引的Hibernate搜索。该实体的@Indexed注释指定了一个自定义拦截器,该拦截器阻止对处于特定状态的实例进行索引 这是完美的预期工作。但是,我注意到,当我使用MassIndexer重新索引所有内容时,它会忽略该实体类上的自定义拦截器。我已经通过调试模式确认了拦截器从未被调用,并且该实体的所有实例都被索引,即使它们符合被跳过的条件 我错过什么了吗?在Hibernate搜索中是否有一种方法可以使用实体类上的任何自定义拦截器来重新编制索引 更新 我已尝试使用以下
@Indexed
注释指定了一个自定义拦截器,该拦截器阻止对处于特定状态的实例进行索引
这是完美的预期工作。但是,我注意到,当我使用MassIndexer
重新索引所有内容时,它会忽略该实体类上的自定义拦截器。我已经通过调试模式确认了拦截器从未被调用,并且该实体的所有实例都被索引,即使它们符合被跳过的条件
我错过什么了吗?在Hibernate搜索中是否有一种方法可以使用实体类上的任何自定义拦截器来重新编制索引
更新
我已尝试使用以下代码片段切换到Sanne建议的“旧式”方法:
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
fullTextSession.beginTransaction();
// Kill the current index
fullTextSession.purgeAll(MyEntity.class);
int batchSize = 10;
ScrollableResults results = fullTextSession.createCriteria(MyEntity.class)
.setFetchSize(batchSize)
.scroll(ScrollMode.FORWARD_ONLY);
int index = 0;
while(results.next()) {
// Re-index entites in batches of 10, freeing up memory after each batch
index++;
fullTextSession.index(results.get(0));
if (index % batchSize == 0) {
fullTextSession.flushToIndexes();
fullTextSession.clear();
}
}
fullTextSession.getTransaction().commit();
但是,我看到的行为与使用MassIndexer
时完全相同。未调用MyEntity
上的条件映射拦截器,所有MyEntity
实例都将被索引,无论它们是否应该被索引。否没有:
工作在它,贡献和测试人员欢迎
您可以使用旧式索引,使用仅可向前滚动的索引,直到修复为止:我遇到了相同的问题。不幸的是,我在任何地方都没有找到好的解决方案。我尝试开发自己的解决方案,但我并不为此感到自豪。也许有人可以改进它
int index = 0;
EntityIndexingInterceptor eii =
((SearchFactoryIntegrator) fullTextSession.getSearchFactory())
.getIndexBindingForEntity(MyEntity.class)
.getEntityIndexingInterceptor();
while(results.next()) {
if (eii.onAdd(results.get(0)) != IndexingOverride.SKIP){ // explit call interceptor
index++;
fullTextSession.index( results.get(0) );
if (index % BATCH_SIZE == 0) {
fullTextSession.flushToIndexes();
fullTextSession.clear();
}
}
}
fullTextSession.flushToIndexes();
我一直在寻找更简单的方法来触发拦截器,但没有成功:(
顺便说一句。
如果查看EntityIndexingInterceptor声明,您可以看到:
//FIXME should we add onPurge and onIndex?
我更新了这个问题,因为即使使用旧式方法,我仍然看到相同的行为。我是否还缺少其他东西,或者您确定有解决此错误的方法吗?我刚刚在
org.hibernate.search.annotations.Indexed
的javadocs中注意到拦截器
元素是“实验性”的(因此,一般而言,条件索引也是如此)。如果您在重新编制索引时不能依赖条件,那么至少文档应该更明确地指出这一点。在决定是否在生产中使用条件索引之前,人们应该意识到这一限制。很抱歉给您带来麻烦。参考文档非常清楚地说明了索引拦截器功能是实验性的:我们不知道具体的问题;)不管怎样,现在你可以在我解决问题时尝试4.2.0.Beta2。啊,有一个“实验性的”参考手册中提到……你是对的!我还确认,MassIndexer
尊重4.2.0.Beta2中的EntityIndexingInterceptor
。但是,旧式的flushToIndexes()
上面讨论的方法仍然不起作用。我认为解决方法包括切换到MassIndexer
,或者用Lucene端的过滤器或Hibernate端的结果转换器替换条件索引。感谢您的工作,Sanne!当建议“旧样式”时我的意思是,既然您正在加载实体,那么应用您可能需要检查的任何规则,然后决定是否调用索引就很简单了。您的观察是正确的,索引方法将对它进行索引-无论拦截器是什么-这都是出于设计。创建了HSEARCH-1225来澄清这一点!感谢您指出这些问题。