Hibernate Search 是一个库,它通过自动索引实体将 Hibernate ORM 与 Apache Lucene 或 Elasticsearch 集成,以启用高级搜索功能:全文、地理空间、聚合等。更多信息,请参阅 hibernate.org 上的 Hibernate Search。

Hibernate Search 4.1.0.Beta2 已发布,包含一个非常有趣的改进:现在可以通过使用 @IndexedEmbedded 精确表达要索引的路径。

之前,在使用 @IndexedEmbedded 时,我们会遍历实体图到指定的深度以索引所有遍历的分支。我们会将所有路径索引到相同的深度,直到达到指定的最大深度或遇到更小的深度值。在复杂模型中,控制确切要索引的内容可能变得复杂。

在论坛上,遇到这个问题的 Zach Kurey 问我 只是出于好奇 为什么我们不提供一个显式的要包含的路径选项。 当然,他写道,肯定有原因。说实话,没有原因:我们只是没想过。

所以,如果你有建议,不要认为我们知道的更好。联系我们!我们的角色是保护代码质量并催化众多聪明用户的经验:我们需要您的反馈来继续改进。

经过 关于 API 和实现细节的长期讨论,本版本使新的 @IndexedEmbedded(includePaths) 功能对所有人可用。感谢 Zach 和 Davide D'Alto,因为他们在贡献设计后还提供了补丁和测试,使这个绝妙的主意对所有人都可用。

它是如何工作的?

在以下 索引实体 中,我们声明在索引每个 人员 时,我们希望索引 姓名姓氏 字段,以及其 父母 字段,通过使用众所周知的 @IndexedEmbedded 注解。

@Entity
@Indexed
public class Person {

   @Id
   public int id;

   @Field
   public String name;

   @Field
   public String surname;

   @OneToMany
   @IndexedEmbedded(includePaths = { "name" })
   public Set<Person> parents;

   @ContainedIn
   @ManyToOne
   public Person child;

    ...//other fields omitted
}

这条新闻是注解的 includePaths 属性,它指出我们不想递归地索引父 人员 的所有字段,而只想索引其 姓名 字段。

这是一个非常简单的示例;参考文档包含了更多示例和细节,请参阅这里。简而言之,它提供了更好的控制,可以确定哪些字段将被索引,避免了索引不必要的对象。当然这可以提高整体性能。

Hibernate Search 4.1.0.Beta2 等你来体验!

当然,这个版本还包含了一些错误修复和改进,更多详情请查看发行说明


回到顶部