Hibernate Search Filter不使用Tokenized字段

时间:2011-09-28 01:01:11

标签: java hibernate lucene hibernate-search

我正在使用Hibernate搜索3.3来搜索Lucene索引。我有一个我需要在某个字段上使用的过滤器,但也使其TOKENIZED用于全文搜索。我发现当我将字段设置为UN_TOKENIZED时,过滤器工作并且全文搜索没有,当我将其设置为TOKENIZED时,全文搜索工作而过滤器不工作。

POJO

@Field(name = "owningOrganization", index = Index.UN_TOKENIZED, store = Store.YES)
@FieldBridge(impl = OrganizationNameFieldBridge.class)
public Organization getOwningOrganization()
{

过滤

@Factory
public Filter getFilter()
{
    BooleanQuery query = new BooleanQuery();
    Term orgTerm = new Term("owningOrganization", userOrganization);
    Term activeTerm = new Term("currentStateIsActive", "1");
    query.add(new TermQuery(orgTerm), Occur.SHOULD);
    query.add(new TermQuery(activeTerm), Occur.SHOULD);
    return new CachingWrapperFilter(new QueryWrapperFilter(query));
}

当我输入owningOrganization:"This is the exact value of an organization"的搜索字词时,我没有得到任何结果,但过滤器可以根据需要运行。当我把它切换到TOKENIZED时相反。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您应该将字段索引两次,一次用于搜索(已分析),一次用于过滤。默认使用 TermQuery 不会应用任何分析。它在索引中搜索指定的术语。

@Fields({
   @Field(name = "owningOrganization_untokenized", index = Index.UN_TOKENIZED),
   @Field(name = "owningOrganization", index = Index.TOKENIZED, store = Store.YES
   }
)
public Organization getOwningOrganization(){
}

使用此方法,您可以使用标记化和非标记化的拥有组织字段。您只需使用正确的字段名称。