通过hibernate搜索索引时,Hibernate过滤器无法正常工作

时间:2011-08-25 12:57:49

标签: lucene hibernate-search hibernate-filters

我正在尝试使用@ 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过滤器是不起作用还是我遗漏了什么? 如果过滤器在索引时不起作用,那么有没有办法不对索引逻辑删除的记录进行索引?

1 个答案:

答案 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");