Hibernate 团队很高兴地宣布推出 Hibernate Search 3.4,它带来了几项新功能,最值得注意的是分面功能:我们继续了 3.3 版本的趋势,当时重点是简化查询)。但大部分工作都集中在性能优化上,您应该会看到在您的应用程序中,尤其是在领域模型变得复杂时,带来的好处。
哦,对于不知道的人来说,Hibernate Search 是在 Hibernate Core(以及 Infinispan)之上运行的全文搜索引擎。
分面
分面是一种将查询结果划分到多个类别的技术。比如说你搜索一辆车,类别可以是
- 品牌(雷诺、奔驰、尼桑、福特)
- 价格范围(低于5000美元、5000-10000美元、10000-20000美元,……)
对于每个类别值,分面功能都会给出匹配元素的数目。这样你就会知道有20辆奔驰和7辆尼桑符合查询。一方面,你看到的是查询结果(通常在页面中央),另一方面(通常在左侧),你看到的是类别及其在查询结果中的分布列表。分面实际上是一个非常智能和情境化的导航工具。
最后,您可以钻取,即选择一个或多个分类结果来细化查询。很难用言语解释这一切,但请查看amazon.com(在部门内进行查询 - 比如在数码单反部门 - 查询“镜头”,您将看到左侧的部门、品牌、客户评论、条件筛选器)。
Hibernate Search 现在提供了一种 API 来实现查询的 Amazon 风格筛选。我们使用 DSL API 来表达一个筛选请求,然后将其附加到查询上。
FacetingRequest priceFacetingRequest = qB .facet() .name( "priceFaceting" ) .onField( "price" ) .range() .below( 1000 ) .from( 1001 ).to( 1500 ) .above( 1500 ).excludeLimit() .createFacetingRequest();
请查看文档以获取更多信息。
首先从二级缓存检索实体
有些人有足够小的数据集,可以将大部分活动数据保存在他们的二级缓存中。到目前为止,Hibernate Search 优先考虑数据库查询。现在您可以自定义数据检索方式,尤其是强制使用二级缓存。
FullTextQuery query = session.createFullTextQuery(luceneQuery, User.class); query.initializeObjectsWith( ObjectLookupMethod.SECOND_LEVEL_CACHE, DatabaseRetrievalMethod.QUERY ); List results = query.getResultList();
非常感谢提出此功能的客户,它在各种情况下都非常有用 :)
Lucene 3.1
Hibernate Search 已升级到 Lucene 的最新版本。虽然 Lucene 区域的一些 API 已更改,但 Hibernate Search 为所有破坏性更改提供了保护。但是请确保检查我们的迁移指南,因为一些 Lucene 配置已更改。
性能改进
在这个版本中投入了大量工作来改进性能。当然,Lucene 3.1 带来了很多增强功能,但我们还改进了 Hibernate Search 引擎。
- 仅在索引属性更改时更新实体:如果实体在 Hibernate Core 中更改,但没有任何索引属性更改,我们将不再触发索引。
- 批量索引器现在在文本分析阶段使用多个线程:批量索引尽可能并行运行工作,我们将实际的文本分析阶段添加到其中。
- 可使用FieldCache以换取性能改进:在内存中加载给定字段的值,并避免后续在 Lucene 索引中查找。请查看参考文档以获取更多信息。
- 在集合更新事件上进行更智能的索引:当我们知道某个集合不会涉及更新索引实体(递归)时,我们将跳过该事件。
内部和 Infinispan
我们已经将 Hibernate Search 查询引擎与 Hibernate Core 正确隔离。现在该引擎作为 Infinispan 5 的查询模块的一部分被重用。好消息是,Infinispan 查询从所有新的 Hibernate Search 功能中受益,包括筛选。
如何尝试
还有许多其他小功能以及许多错误修复,请确保查看我们的变更日志以获取所有详细信息。
Hibernate Search 3.4 与 Hibernate Core 的最新版本(3.6.x)兼容。请查看 JBoss.org 的 Maven 存储库或下载发行版上的新版本。您还可以阅读文档。如果您将应用程序从以前的 Hibernate Search 版本迁移过来,请确保查看迁移指南。
JUDCon 和 JBoss World
如果您对 JBoss 感兴趣,您必须来JBoss World(2011年5月3日至6日在美国马萨诸塞州波士顿)。Sanne 和我将在 Hibernate OGM 和如何使用 JPA 将数据存储在 Infinispan 上进行演讲。更多信息稍后公布(提示,我们使用 Hibernate Search :))。
如果您负担不起JBoss World(即使您能负担),请尽量参加JUDCon,这是JBoss.org社区会议(2011年5月2日至3日在美国马萨诸塞州波士顿举行)。Sanne将讨论Infinispan上的搜索(提示:他将使用Hibernate Search)。更多信息及注册请点击这里。