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



我有一个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) );
...

则启用了此筛选器的CCD_ 3将按预期工作。

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

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

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

我这里缺了什么吗?很明显,这些信息就在那里,因为我可以在卢克那里搜索。对于像这样的嵌入式字段,而不是简单的字段,使用Hibernate Search来实现FullTextFilter有什么特别的地方吗?

在进行一个简单的单元测试以提交错误通知单时,我发现了真正的问题。问题不在于简单字段与复杂字段。这个问题是对资本化的愚蠢误解,令人沮丧。

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

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

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

最新更新