Hibernate Search能否使用嵌入式集合字段实现Lucene FullTextFilter?

Hibernate Search能否使用嵌入式集合字段实现Lucene FullTextFilter?,hibernate,lucene,hibernate-search,Hibernate,Lucene,Hibernate Search,我有一个Hibernate搜索实体类,看起来像这样: @实体 @索引 @FullTextFilterDefs({ @FullTextFilterDef(name=“myFilter”,impl=MyFilterFactory.class) }) 公共类父类{ ... @纵队 @场 私有字符串名称; @许多 @指数化 私人儿童; ... } 与之相关的优点同样简单: @实体 @索引 公营儿童{ ... @纵队 @场 私有字符串名称; @许多(mappedBy=“儿童”) @包含 私人家长; ..

我有一个Hibernate搜索实体类,看起来像这样:

@实体
@索引
@FullTextFilterDefs({
@FullTextFilterDef(name=“myFilter”,impl=MyFilterFactory.class)
})
公共类父类{
...
@纵队
@场
私有字符串名称;
@许多
@指数化
私人儿童;
...
}
与之相关的优点同样简单:

@实体
@索引
公营儿童{
...
@纵队
@场
私有字符串名称;
@许多(mappedBy=“儿童”)
@包含
私人家长;
...
}
如果
MyFilterFactory.getFilter()
方法使用的是一个简单的
Parent
字段,如下所示(硬编码以便于说明):

。。。
术语=新术语(“姓名”、“爸爸”);
查询查询=新术语查询(术语);
返回新的CachingWrapperFilter(newquerywrapperfilter(query));
...
。。。然后启用此筛选器的
FullTextQuery
,将按预期工作

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

。。。
学期=新学期(“儿童姓名”、“少年”);
查询查询=新术语查询(术语);
返回新的CachingWrapperFilter(newquerywrapperfilter(query));
...
。。。尽管搜索表达式
children.name:parent=junior
在Luke中运行良好,但每次我都会得到0次点击


这里有我遗漏的东西吗?很明显,信息就在那里,因为我可以在卢克身上搜索。Hibernate Search是否有什么特别的功能,可以针对这样的嵌入式字段而不是简单的字段实现
FullTextFilter
。问题不是简单字段与复杂字段的问题。这个问题是一个令人沮丧的关于资本化的愚蠢误解

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

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


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

好吧,您的示例中似乎缺少一个重要部分,即名称字段上的@index。如果这只是你的一个疏忽,它应该真的起作用。如果你能在单元测试中重现这个问题,我建议你在这里提交一个问题——顺便说一句,你说的“children.name:parent=junior works”是什么意思?这个查询没有意义。parent=part的处理方法是什么?难道不仅仅是类本身的
@index
?我已经在这两个类上建立了
@索引
,并且我分别用
@IndexedEmbedded
@ContainedI
n注释了相关字段。然而,我忽略了将@Field放在可搜索字段上,所以我更新了上面的代码片段。一旦我能够打包一个合适的单元测试,我就会创建一个JIRA票证。正确。当使用原生Lucene查询时,一件重要的事情是对查询应用与索引过程相同的分析器。搜索DSL试图为您做出正确的选择。