Hibernate Search可以使用嵌入式收集字段实现Lucene FullTextFilter吗?

时间:2012-10-10 22:50:56

标签: hibernate lucene hibernate-search

我有一个看起来像这样的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) );
...

...然后启用此过滤器的FullTextQuery按预期工作。

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

...
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中搜索它。你有什么特别的东西可以用Hibernate Search对这样的嵌入字段实现FullTextFilter,而不是简单的字段吗?

1 个答案:

答案 0 :(得分:1)

在整理一个简单的单元测试时,我会发现真正的问题。问题不在于简单字段与复杂字段。问题是对资本化的一种令人沮丧的愚蠢的误解。

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

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

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