【问题标题】:Hibernate Search Filter not working with Tokenized field休眠搜索过滤器不适用于标记化字段
【发布时间】:2011-09-28 01:01:11
【问题描述】:

我正在使用 Hibernate search 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 时则相反。

有什么建议吗?

【问题讨论】:

    标签: java hibernate lucene hibernate-search


    【解决方案1】:

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

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

    通过这种方法,您可以使用标记化和未标记化的拥有组织字段。您只需要使用正确的字段名称即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多