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

今天,我们自豪地宣布第一个 Alpha 版本,它引入了对 Elasticsearch 的实验性集成!

我们还更新了 Apache Lucene 5.5,这是我们最喜欢的搜索引擎的最新稳定版本,因为我们当然不会放弃我们的传统用户!

什么是 Hibernate Search / Elasticsearch 集成?

Hibernate Search 和 Elasticsearch 都可以做更多的事情,但为了在较高层次上解释这种集成,我将简化它们的定义:

Hibernate Search

是超级流行的 Hibernate ORM 框架的流行扩展,它使得使用 Apache Lucene 索引和查询实体变得容易。

Elasticsearch

是一个非常流行的 REST 服务器,它封装了 Apache Lucene 的功能,使得横向扩展此服务变得更容易。

直到今天,当使用 Hibernate Search 时,您将直接使用 Apache Lucene,我们将其称为“嵌入式模式”。在这种模式下,查询由您的应用程序的同一进程执行,尽管索引在后台发生,但这种处理的开销仍然发生在与您的 Hibernate 应用程序相同的服务器和 JVM 进程中。

通过 Elasticsearch 集成,我们不是直接通过管理 Lucene 资源来索引实体,而是将 RPC 发送到 Elasticsearch 集群以实现类似的目的:毕竟,它也是基于 Lucene 的,所以功能匹配非常接近!

这意味着我们可以将所有当前功能透明地映射到这个新的替代后端,并且通过这样做,在您的应用程序中提供更多的架构选择,同时所需更改最小:目标是为大多数用户,差异主要在于配置细节。

当使用Elasticsearch时,我们需要在网络上发送RPC以运行查询和索引更新,但另一方面,您可以从微服务风格的解耦以及Elasticsearch可以提供的所有美好特性中受益,这些特性用于运行和管理水平可扩展的集群。

总之...

Elasticsearch将为您管理索引,Hibernate ORM将管理您的对象和事务,Hibernate Search将透明地保持Elasticsearch与您的数据库事务同步,并允许您查询领域模型返回受管理的对象,但将繁重的工作移交给独立的服务。

Elasticsearch集成状态

这项工作目前正在开发中,因此请不要期望它功能完善,也不够可靠,无法在生产系统中运行。尽管如此,我们已经有了一组非常出色的功能正在运行,因此现在是开始尝试它的好时机,并希望提供一些反馈。

文档中增加了一个新的Elasticsearch章节,这是开始的好地方。

配置Elasticsearch后端

依赖项

您需要一个名为org.hibernate:hibernate-search-backend-elasticsearch的新依赖项。

Hibernate Search与Elasticsearch的Maven依赖项

<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-search-backend-elasticsearch</artifactId>
   <version>5.6.0.Alpha2</version>
</dependency>
<dependency>
   <groupId>org.hibernate</groupId>
   <artifactId>hibernate-search-orm</artifactId>
   <version>5.6.0.Alpha2</version>
</dependency>

配置选项

将其指向您的Elasticsearch节点

hibernate.search.elasticsearch.host http://127.0.0.1:9200

启用后端以用于所有索引实体

hibernate.search.default.indexmanager elasticsearch

允许其销毁和创建索引

hibernate.search.elasticsearch.index_management_strategy CREATE_DELETE

有关这些配置选项的详细信息,请参阅参考文档

更新索引

与嵌入式模式下的Lucene一样,当您创建或更新实体时,这些实体使用相同的注解映射到Hibernate Search(请参阅将实体映射到索引结构),索引会自动更新。

在Elasticsearch映射实体上运行查询

在许多情况下,现有的查询方式(请参阅查询)应该可以工作:我们自动翻译最常见类型的Apache Lucene查询以及Hibernate Search DSL生成的许多查询。

除了翻译Lucene查询外,您还可以使用其字符串格式或JSON格式直接创建Elasticsearch查询

从字符串创建Elasticsearch原生查询

FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryDescriptor query = ElasticsearchQueries.fromQueryString("title:tales");
List<?> result = fullTextSession.createFullTextQuery(query, ComicBook.class).list();

从JSON创建Elasticsearch原生查询

FullTextSession fullTextSession = Search.getFullTextSession(session);
QueryDescriptor query = ElasticsearchQueries.fromJson(
      "{ 'query': { 'match' : { 'lastName' : 'Brand' } } }");
List<?> result = session.createFullTextQuery(query, GolfPlayer.class).list();

接下来还有大量工作要做

这是一个早期预览,虽然我们对一些进展感到自豪,但仍有几个方面需要大量编码。另一方面,实现其中的一些并不是很难:这可能是一个加入项目的完美时机。

请检查JIRA和邮件列表以获取更新,但至少在撰写本文时,以下功能尚未知不能工作

  • 分析器定义没有被应用

  • 空间查询需要更多工作

  • 过滤器还不能应用

  • 切分功能基本实现

  • 未应用计划索引优化

  • 查询超时

  • 通过查询删除

  • 忽略日期类型映射的解析

  • 在大结果集上滚动目前无法工作

  • MoreLikeThis 查询

  • 混合基于Lucene的索引和基于Elasticsearch的索引

与性能和效率相关的任何方面也仅会在基本功能开发完成后考虑。

API更改

5.x系列中,我们将保持向后兼容性。

这可能意味着Hibernate Search / Elasticsearch的集成API可能不是完美的。这是我们在6.x系列中将解决的问题。但我们的重点是提供正确的一组功能,并在5.x中获取反馈,然后再改进API。

简而言之,6.x将取决于您在5.6中如何使用此功能。

如何获取此版本

您需要的所有内容都可以在Hibernate Search的网站上找到。

使用上述坐标从Maven Central获取。

来自Sourceforge的下载也可用,但这些尚未包含Elasticsearch集成组件。类似地,WildFly模块也尚未包括新的Elasticsearch扩展。

反馈

欢迎反馈!

请通过在JIRA上创建问题、通过发送电子邮件到开发者的邮件列表或在论坛上发帖来告诉我们任何问题或建议。

我们还会监控Stack Overflow;在SO上发帖时,请使用标签hibernate-search


返回顶部