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

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,请确保查看迁移指南


回到顶部