在Hibernate搜索中使用Lucene Filter

时间:2014-08-02 09:43:27

标签: java hibernate hibernate-search

我有一个课程项目。项目具有“状态”属性。状态可以是'A' - 活动,'I' - 不活动。状态变化的时间。 物品有一些其他属性,例如'name'等可以编入索引。 应用程序的用户可以按名称等搜索项目。之后,他们会显示相关项目列表。 不应显示非活动项目。

要过滤掉我声明过滤器的非活动项目:

@FullTextFilterDef(name = "statusFilter", impl = StatusFilterFactory.class)
public class Item
{ ... }


public class StatusFilterFactory {

  @Factory
  public Filter getFilter() {
    BooleanQuery query = new BooleanQuery();
    Term statusTerm = new Term("status", "A");
    query.add(new TermQuery(statusTerm), BooleanClause.Occur.MUST);
    return new CachingWrapperFilter(new QueryWrapperFilter(query));
  }
}

当我需要创建项目列表时,我使用enableFullTextFilter(“statusFilter”)方法:

fullTextQuery.setSort(sort).setFirstResult(offset).setMaxResults(limit).enableFullTextFilter("statusFilter");

但如果我不使用这种方法,我会得到相同的结果。过滤掉非活动项目。

问题是:

  1. 我是否需要声明此过滤器?或者我可以直接使用它(怎么样?)。
  2. 似乎新创建的非活动项目根本没有编入索引。为什么?过滤器的声明如何影响索引?
  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

1

如果您不想使用 @FullTextFilterDef ,可以使用

org.hibernate.search.FullTextQuery.setFilter(Filter)

但建议使用声明性定义,因为上述方法已被半弃用并被视为已删除。 (实际上,如果您确实需要它,请告诉我们。)

2

不,Filter实例对索引更新没有影响。其他一些因素会影响您的测试,例如,不要忘记更新的索引是在提交时执行的,而不是之前。

替代

您可能还想考虑使用indexing interceptor。与过滤器相比的效果类似:

  • 使用拦截器时,保持索引较小,可能效率更高。
  • 使用过滤器时,您可以选择允许搜索非活动条目;如果在不同的用例中你也需要允许搜索非活动项目,这可能很有用。
相关问题