【问题标题】:Can Hibernate Search implement a Lucene FullTextFilter using embedded collection fields?Hibernate Search 可以使用嵌入式集合字段实现 Lucene FullTextFilter 吗?
【发布时间】: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


【解决方案1】:

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

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

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

确认过滤器参数转为小写后,问题解决。

【讨论】:

  • 正确。当使用原生 Lucene 查询时,一件重要的事情是对查询应用与索引过程相同的分析器。 Search DSL 会尝试为您做出正确的选择。
猜你喜欢
  • 1970-01-01
  • 2011-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多