在Hibernate Annotations 3.2.1中,最显著的部分是对Hibernate Search(原名Hibernate Lucene)的完全重写和功能扩展。
简而言之
Hibernate Search允许您无需全文本技术带来的麻烦和匹配问题即可搜索您的域模型(谷歌一下)。索引是自动完成的,对象模型与索引文档之间的映射通过注解描述,查询能力与常规Hibernate查询系统集成。Hibernate Search在底层使用Apache Lucene,降低了进入该技术的门槛。
它到底是怎么回事
简而言之,将Google搜索功能带到您的域模型。
对于大多数人来说,查询等同于SQL查询,这在大多数应用中确实如此。然而,存在一系列查询,这些查询不能由SQL(至少没有专有扩展)处理:自由文本搜索、邻近搜索、短语搜索、同义词、接近的术语、按相关性排序...全文搜索引擎解决了这些问题。
全文搜索查询涉及两个步骤。索引,即维护数据库信息与全文索引信息之间的连贯性。查询,即能够以“自由形式”查询索引信息的能力。
将此类搜索功能集成到系统中并不容易。在大多数系统中,应用程序核心使用的数据结构与全文搜索使用的数据结构之间存在不匹配。对于使用Hibernate等ORM的应用程序,前者主要围绕对象模型设计,而后者则围绕包含多个字符串字段的文档概念设计。处理这种不匹配并保持系统两部分之间的数据同步往往过于繁琐,难以大规模采用。
Hibernate Search旨在为您解决不匹配复杂性,并降低在大多数应用程序中采用如Apache Lucene等全文技术门槛。
索引
Hibernate Search是Hibernate和Apache Lucene之间的粘合代码。Apache Lucene是一个出色的全文索引Java库,在开源世界中是事实标准。Hibernate Search利用Hibernate事件模型监听对域模型所做的任何更改。对您的持久化对象所做的所有修改都将透明地传播到Apache Lucene索引中。在底层,Hibernate Search通过批处理工作来优化索引。当前的实现按照事务队列工作。其他可插拔实现将很快实现。最后,您可以强制对给定的一组对象进行索引,这在初始化索引时特别有用。索引的组织方式基本由您决定,您可以为每个实体类型(推荐)拥有一个目录(索引)或者为多个实体共享同一个目录。
元数据
索引意味着将Java对象属性转换为(可能退化的)字符串表示。属性与索引字段之间的桥梁由注解元数据和默认的内置桥梁集驱动。通过使用自定义桥梁(非常类似于/UserType/的概念)提供灵活性。
搜索
不匹配之一是Apache Lucene的全文查询返回/Domains/而不是常规域对象。Hibernate Search实现了/org.hibernate.Query/,并为您提供了一个统一的查询模型,无论查询引擎是(criteria、HQL、SQL、Lucene)。特别是,您可以使用分页和所有查询API(如/scroll/、/list/等)。所有查询都将返回管理对象(即附加到会话),您可以像常规Hibernate管理对象一样随意使用和修改它们(因为它们/就是/常规管理对象)。您可以决定查询所有实体或仅查询它们的一部分。在Hibernate中,查询实体的一部分是多态的。
试试看
Hibernate Search的真正目标是降低全文引擎技术门槛。Apache Lucene经常被初学者批评其低级API和固有复杂性。Hibernate Search使其易于使用,去除了一些复杂性,但让您在需要时能够访问Apache Lucene的全部力量和灵活性。Hibernate Search是Hibernate注解的一部分。查看详情 和 下载它 ,使用它比解释它简单得多 :-)