我正在尝试使用@ IndexedEmbedded索引具有一对多关联的嵌入式集合(Set)。问题是我们只是软删除应用程序中的记录而我想在索引集合上应用hibernate过滤器以便在编制索引时排除逻辑删除的记录。
@Index
Class A {
@IndexedEmbedded
@OneToMany(targetEntity = B.class, fetch = FetchType.EAGER)
@Filter(name = "deletedRecordsFilter")
Set<B> setOfBs;
}
索引:
FullTextSession fts = getFullTextSession();
fts.createIndexer(entityClass)
.purgeAllOnStart(true)
.optimizeAfterPurge(true)
.optimizeOnFinish(true)
.batchSizeToLoadObjects(30)
.threadsForSubsequentFetching(8)
.threadsToLoadObjects(4)
.threadsForIndexWriter(3)
.startAndWait();
我已使用session.enableFilter(“deletedFilterRecords”)启用了过滤器。数据已编制索引但过滤器无法正常工作。嵌入式集合仍包含已删除的记录。
通过hibernate搜索索引时,hibernate过滤器是不起作用还是我遗漏了什么? 如果过滤器在索引时不起作用,那么有没有办法不对索引逻辑删除的记录进行索引?
答案 0 :(得分:1)
您应该使用FullTextFilter,而不是标准的Hibernate过滤器。我在我正在进行的项目中使用了一个。您可以在索引类的定义上方添加注释,如下所示:
@Indexed
@Entity
@FullTextFilterDefs( {
@FullTextFilterDef(name = "includeInSearchFilter", impl = IncludeInSearchFilterFactory.class,
cache = FilterCacheModeType.INSTANCE_AND_DOCIDSETRESULTS)
})
public class SomeEntity ...
然后您需要提供引用的工厂类,如下所示:
public class IncludeInSearchFilterFactory {
private String includeInSearchResults;
public void setIncludeInSearchResults(String includeInSearchResults) {
this.includeInSearchResults = includeInSearchResults;
}
@Key
public FilterKey getKey() {
StandardFilterKey key = new StandardFilterKey();
key.addParameter(includeInSearchResults);
return key;
}
@Factory
public Filter getFilter() {
Query query = new TermQuery(new Term("includeInSearchResults", includeInSearchResults));
return new QueryWrapperFilter(query);
}
}
在我的情况下,“includeInSearchResults”成员是实体上的索引字段,如果我希望我的搜索返回该对象,则设置为true,否则将其设置为false。
启用全文过滤器:
fullTextQuery.enableFullTextFilter("includeInSearchFilter").setParameter("includeInSearchResults", "true");