实体的全文搜索
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();
简单而强大
从头开始设计,旨在易于使用。在您专注于搜索的业务方面时,会透明地处理模式初始化、索引和查询语法。
如果您需要超越,它不会阻止您:原生Lucene 查询或Elasticsearch JSON可以插入到 Search DSL 查询的中间。
本地或分布式
虽然您会发现基于Apache Lucene的“单机”性能非常出色,但您也可以通过将应用程序分布到Elasticsearch集群来进行扩展,只需进行一些配置更改。
为了实现更好的扩展和与 Elasticsearch 后端的协调,Hibernate Search 还可以将实体更改事件发送到数据库中的事务性出站表,将索引分散到多个异步事件处理器。
空间查询
索引地理定位实体就像添加@GenericField
注解一样简单。
过滤特定位置周围的结果,例如用户位置,并使用距离排序将最靠近用户的匹配比萨店拉到顶部。
聚合
获取按组和类别聚合的搜索结果。
例如,网络商店将希望显示所有匹配项,以及按价格范围和品牌显示匹配项的计数。