【发布时间】:2012-10-10 22:50:55
【问题描述】:
我有一个看起来像这样的 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) );
...
...尽管搜索表达式 children.name:parent=junior 在 Luke 中工作得很好,但我每次都得到 0 次点击。
我在这里缺少什么吗?显然信息就在那里,因为我可以在 Luke 中搜索它。对于像这样的嵌入字段,而不是简单的字段,您是否需要与 Hibernate Search 做一些特别的事情来实现 FullTextFilter?
【问题讨论】:
-
好吧,您的示例中似乎缺少一个重要部分,即名称字段中的 @Indexed。如果这只是你的疏忽,它应该真的有效。如果您可以在单元测试中重现该问题,我建议您在此处提交问题 - hibernate.onjira.com/browse/HSEARCH
-
顺便说一句,'children.name:parent=junior works' 是什么意思?这个查询没有意义。与 parent= 部分有什么关系?
-
@Indexed不是只针对班级本身吗?我已经在两个类上都有@Indexed,并且我的相关字段分别用@IndexedEmbedded和@ContainedIn 注释。但是,我忽略了将@Field 放在可搜索字段上,所以我更新了上面的代码 sn-ps。一旦我可以打包一个适当的单元测试,我就会创建一个 JIRA 票证。
标签: hibernate lucene hibernate-search