Hibernate Search 3.3 的首个Beta版本已发布。我们设定了几个目标。
其中之一是将项目转变为一个更独立的 Infinispan 软件。我们围绕 Infinispan、搜索和持久化有许多令人兴奋的发展。但这将是另一篇文章的主题。现在让我们谈谈重点。
Hibernate Search 查询 DSL
最引人注目的新功能可能是新的 Hibernate Search 查询 DSL。
编写 Lucene 查询并不容易,要么使用限制自己于相当简单的查询和操作字符串的查询解析器,要么使用相当冗长且包含众多设置和选择的 Lucene 程序化查询 API。
除此之外,您还需要确保在查询和索引时应用相同的魔法:如果您不这样做,您要查找的索引键将不会匹配,您将返回无结果。这在对象世界中尤其如此,因为这里发生两次转换
- 对象通过 Hibernate Search 的FieldBridge
- 转换成字符串
每个属性都可以有不同的字段桥接器和分析器组合。
Hibernate Search 通过透明地应用适当的FieldBridge和针对给定研究属性的分析器来解决这个问题。它还围绕流畅的 API 构建,使查询非常容易编写,更重要的是更容易阅读。
QueryBuilder mythQB = searchFactory.buildQueryBuilder().forEntity( Myth.class ).get(); //look for popular modern myths that are not urban Date twentiethCentury = ...; Query luceneQuery = mythQB .bool() .must( mythQB.keyword().onField("description_stem").matching("urban").createQuery() ) .not() .must( mythQB .range() .onField("starred") .from(3).excludeLimit() .to(5) .createQuery() ) .must( mythQB .range() .onField("creationDate") .above(twentiethCentury) .createQuery() ) .createQuery();
此示例展示了许多内容
- 流畅的 API 在实际应用中的效果(你不得不承认它比原始 Lucene 查询更易读)
- 您传递的是对象而不是字符串表示(日期和数字(在这种情况下)
- description_stem使用词干分析器(例如,将loving转换为它的根词love):不需要在传递匹配字符串之前自己应用它,查询DSL会为您完成。
我将在不久的将来详细博客介绍Hibernate Search查询DSL。
Hibernate Core 3.6
这个版本与Hibernate Core 3.6兼容(在撰写本文时处于Beta3阶段)。一个副作用是,即使只使用hbm.xml文件,也不再需要手动配置事件监听器。
统计信息
Hardy一直在忙于设计一个统计API(可通过SearchFactory获取)。它提供了关于Hibernate Search的大量信息
- Lucene查询执行的平均和最大时间
- Lucene查询执行后对象加载过程的平均和最大时间
- 最慢的查询
- 特定类型的索引实体数量
- 等等
再次提醒,更详细的博客文章将很快发布。
JTA和Spring的集成测试
我们已经为Spring框架和JTA添加了集成测试。在JTA方面,我们正在针对Bitronix和JBoss Transactions独立测试。
可变SearchFactory
尽管这不是一个公开的功能,但Hibernate Search现在具有动态添加新实体类型的能力。
从底层开始,我们确保Hibernate Search在运行时非常快且高效。为了实现这一点,我们使用不可变设计为SearchFactory:我们预先计算并存储元数据,以提高索引和查询的效率。这迫使我们提前知道索引的实体类型列表。
然而,Infinispan并不一定提前知道实体列表。新的设计使用“变更时复制”方法,在保持不可变模型优势的同时,提供了添加新实体的能力。作为用户,您可能不会注意到这一点,但作为使用Hibernate Search的框架,您会:)
错误修复
当然我们也修复了错误:)
请查看JBoss.org的Maven 存储库或下载发行版上的新版本。您还可以在这里阅读文档。请注意,此版本破坏了几个SPI,请确保查看迁移指南。