0

我有一个看起来像这样的 Hibernate Search 实体类:

@Entity
@Indexed
@FullTextFilterDefs({
   @FullTextFilterDef(name="myFilter", impl=MyFilterFactory.class)
})
public class Parent {
   ...
   @Column
   @Field
   private String name;

   @ManyToMany
   @IndexedEmbedded
   private Set<Child> children;
   ...
}

关联的实体同样简单明了:

@Entity
@Indexed
public class Child {
   ...
   @Column
   @Field
   private String name;

   @ManyToMany(mappedBy="children")
   @ContainedIn
   private Set<Parent> parents;
   ...
}

如果该MyFilterFactory.getFilter()方法使用这样的简单字段Parent(硬编码以便于说明):

...
Term term = new Term("name", "daddy");
Query query = new TermQuery(term);
return new CachingWrapperFilter( new QueryWrapperFilter(query) );
...

... thenFullTextQuery启用此过滤器后,将按预期工作。

但是,如果我将过滤器更改为使用嵌入字段的字段

...
Term term = new Term("children.name", "Junior");
Query query = new TermQuery(term);
return new CachingWrapperFilter( new QueryWrapperFilter(query) );
...

...然后我每次都得到 0 次点击,尽管搜索表达式children.name:parent=junior在 Luke 中工作得很好。

我在这里缺少什么吗?显然信息就在那里,因为我可以在 Luke 中搜索它。FullTextFilter对于像这样的嵌入式字段,而不是简单的字段,您与 Hibernate Search 有什么特别的关系吗?

4

1 回答 1

1

在整理一个简单的单元测试来提交错误单时,我发现了真正的问题。问题不是简单字段与复杂字段的问题。问题在于对大小写的一个令人沮丧的愚蠢误解。

通常,当 Hibernate Search 构建 Lucene 索引时,标准分析器会将所有字段值转换为小写。当您主要使用 Hibernate Search DSL 进行查询时,您会习惯于不区分大小写。但是,当您直接使用 Lucene API 进行查询时,您有责任将搜索词设为小写以匹配索引。

我最初看到的行为是由于我的搜索词的情况。当我过滤一个简单的字段时,我碰巧使用了一个全小写的字符串。当我过滤一个复杂的字段时,我碰巧使用了一个带有大写字母的字符串。

确保过滤器参数转换为小写后,问题得到解决。

于 2012-10-11T16:24:31.867 回答