今天,我们自豪地宣布第一个 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集成状态
这项工作目前正在开发中,因此请不要期望它功能完善,也不够可靠,无法在生产系统中运行。尽管如此,我们已经有了一组非常出色的功能正在运行,因此现在是开始尝试它的好时机,并希望提供一些反馈。
文档中增加了一个新的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();
如何获取此版本
您需要的所有内容都可以在Hibernate Search的网站上找到。
使用上述坐标从Maven Central获取。
来自Sourceforge的下载也可用,但这些尚未包含Elasticsearch集成组件。类似地,WildFly模块也尚未包括新的Elasticsearch扩展。
反馈
欢迎反馈!
我们还会监控Stack Overflow;在SO上发帖时,请使用标签hibernate-search
。