Hibernate Search

ORM、Lucene 和 Elasticsearch 集成。

将 Hibernate ORM 实体自动索引到 Apache Lucene 或 Elasticsearch 中。高级搜索 API:全文搜索、地理空间搜索、聚合等等。

实体的全文搜索

Hibernate Search 会自动从 Hibernate ORM 实体中提取数据,并将其推送到本地 Apache Lucene 索引或远程 Elasticsearch/OpenSearch 索引。

它包含以下功能:

  • 声明式映射 实体属性到索引字段,可以通过注解或编程 API 实现。

  • 按需批量索引 数据库中的所有实体,以使用预先存在的数据初始化索引。

  • 动态监听器触发的索引 通过 Hibernate ORM 会话修改的实体,以始终保持索引更新。

  • 搜索 DSL 用于轻松构建全文搜索查询,并将命中结果作为 Hibernate ORM 实体检索。

  • 以及更多功能!(见下文)

例如,您可以像这样映射实体

@Entity
// This entity is mapped to an index
@Indexed
public class Book {

    // The entity ID is the document ID
    @Id
    @GeneratedValue
    private Integer id;

    // This property is mapped to a document field
    @FullTextField
    private String title;

    @ManyToMany
    // Authors will be embedded in Book documents
    @IndexedEmbedded
    private Set<Author> authors = new HashSet<>();

    // Getters and setters
    // ...
}

@Entity
public class Author {

    @Id
    @GeneratedValue
    private Integer id;

    // This property is mapped to a document field
    @FullTextField
    private String name;

    @ManyToMany(mappedBy = "authors")
    private Set<Book> books = new HashSet<>();

    // Getters and setters
    // ...
}

像这样索引预先存在的数据

SearchSession searchSession = Search.session( entityManager );
MassIndexer indexer = searchSession.massIndexer( Book.class );
indexer.startAndWait();

监听器触发的索引不需要对基于 JPA 或 Hibernate ORM 的代码进行任何更改

Author author = new Author();
author.setName( "Isaac Asimov" );

Book book = new Book();
book.setTitle( "The Caves Of Steel" );
book.getAuthors().add( author );
author.getBooks().add( book );

entityManager.persist( author );
entityManager.persist( book );

并像这样进行搜索

SearchResult<Book> result = Search.session( entityManager )
        .search( Book.class )
        .where( f -> f.match()
                .fields( "title", "authors.name" )
                .matching( "Isaac" ) )
        .fetch( 20 );

List<Book> hits = result.hits();
long totalHitCount = result.total().hitCount();

完全控制

与 Web 搜索不同,这是您的数据、您的领域、您的应用程序,存储在您决定的任何位置。

您可以使用 每个属性映射 非常精确地选择要索引的内容(以及如何索引),并使用 自定义桥接 进一步扩展。

您还可以使用 可配置的分析 对数据处理方式进行更好的控制,因此您可以:

  • 针对特定语言调整文本处理。

  • 针对特定领域的术语调整文本处理(例如医学术语、自定义缩写扩展等等)。

  • 控制排名过程:哪些结果更重要。

简单而强大

从头开始设计,旨在易于使用。在您专注于搜索的业务方面时,会透明地处理模式初始化、索引和查询语法。

搜索 DSL 通过简洁、易于使用的 API 公开许多不同的 谓词排序

如果您需要超越,它不会阻止您:原生Lucene 查询Elasticsearch JSON可以插入到 Search DSL 查询的中间。

本地或分布式

虽然您会发现基于Apache Lucene的“单机”性能非常出色,但您也可以通过将应用程序分布到Elasticsearch集群来进行扩展,只需进行一些配置更改。

为了实现更好的扩展和与 Elasticsearch 后端的协调,Hibernate Search 还可以将实体更改事件发送到数据库中的事务性出站表,将索引分散到多个异步事件处理器。

空间查询

索引地理定位实体就像添加@GenericField注解一样简单。

过滤特定位置周围的结果,例如用户位置,并使用距离排序将最靠近用户的匹配比萨店拉到顶部。

聚合

获取按组和类别聚合的搜索结果。

例如,网络商店将希望显示所有匹配项,以及按价格范围和品牌显示匹配项的计数。

返回顶部