新扩展:Hibernate Search + Elasticsearch

在 Quarkus 的 0.15.0 版本中,我们引入了 Hibernate Search + Elasticsearch 扩展,并在 0.16.0 版本中添加了指南快速入门示例,解释了如何使用它。

如果您想在 Elasticsearch 中索引您的 Hibernate ORM 实体,并且不介意偶尔更新代码,非常欢迎您成为早期采用者并提供反馈。

这是我很久以来最喜欢的工具。在过去,当我为客户开发业务应用程序时,发现 Hibernate Search 真正改变了我们实现搜索引擎的方式,我们的客户对我们从那时起提供的搜索功能非常满意。我很快开始为此做贡献……然后,我就在这里了。

通过一个额外的依赖项和一些配置,您最终可以为用户提供全文搜索功能,只需将您的 Hibernate ORM 实体同步到一个全文索引即可。

当我提到全文搜索时,我指的是真正的全文搜索,它由 Apache LuceneElasticsearch 支持。

为什么用 Quarkus 更好?

使用 Quarkus 上的 Hibernate Search 的好处是,当使用 GraalVM 编译原生应用程序时,我们会在编译时构建 Hibernate Search 元模型。

预计您的原生应用程序启动速度将比以往更快!

如何使用?

再简单不过了。

首先,将 quarkus-hibernate-search-elasticsearch 扩展添加到您的 Quarkus 应用程序中

./mvnw quarkus:add-extension -Dextension=hibernate-search-elasticsearch

(或者您可以直接将 io.quarkus:quarkus-hibernate-search-elasticsearch 依赖项添加到您的 pom.xml

然后,选择一个您的 Hibernate ORM 实体并添加一些注解

package org.acme.hibernate.search.elasticsearch.model;

import javax.persistence.Entity;

import org.hibernate.search.mapper.pojo.mapping.definition.annotation.FullTextField;
import org.hibernate.search.mapper.pojo.mapping.definition.annotation.Indexed;

import io.quarkus.hibernate.orm.panache.PanacheEntity;

@Entity
@Indexed (1)
public class Book extends PanacheEntity {

    @FullTextField(analyzer = "standard") (2)
    public String title;
}
1 将您的实体声明为全文索引的一部分
2 使用 Elasticsearch 提供的 standard 分析器添加一个全文字段

然后向您的 src/main/resources/application.properties 添加一些附加配置

quarkus.hibernate-search.elasticsearch.version=7
quarkus.hibernate-search.elasticsearch.automatic-indexing.synchronization-strategy=searchable
quarkus.hibernate-search.elasticsearch.index-defaults.lifecycle.strategy=drop-and-create
quarkus.hibernate-search.elasticsearch.index-defaults.lifecycle.required-status=yellow

我在这里不会给出所有细节。您应该知道,这个配置适合测试,但绝对不适合生产环境!

就是这样。

从现在开始,如果您在本地使用默认端口启动 Elasticsearch 集群,您的 Book 实体将被索引到该集群中。

并且要搜索它们(这不就是它的重点吗?),我们提供了一个易于使用的 DSL

return Search.getSearchSession(em)
        .search(Book.class)
        .predicate(f ->
            f.simpleQueryString().onFields("title").matching(pattern)
        )
        .fetchHits();

更进一步

这只是我们 Hibernate Search + Elasticsearch 扩展功能的一小部分。

例如,理解文本分析的概念对于全文搜索尤其重要,并且根据您的需求正确设置分析器需要更多的工作。

您将在我们详尽的指南中找到更多关于如何正确设置所有内容的信息。