我们刚刚发布了Hibernate Search 6.0.0.Alpha3,这是仍在开发的6.0分支的第三个发布版本。本版本主要增加了对更多字段类型和谓词的支持,并带来了更一致且更简洁的API。
Hibernate Search 6入门
如果您想立即深入了解新的、闪亮的Hibernate Search 6,参考文档中的入门指南是一个很好的起点。
Hibernate Search 6仍在开发中,其API与Search 5有很大差异。 有关该分支的当前状态,请参阅hibernate.org上的Search 6专属页面。 有关迁移以及我们打算如何帮助您的更多信息,请参阅迁移指南。 |
新增功能
自上次发布以来已经有一段时间了。但这也意味着我们已经取得了很大的进步!
Quarkus集成
您可能已经听说过Quarkus,这是一个旨在显著提高Java应用程序启动时间和内存使用的框架和工具集。
我们一直在努力将Hibernate Search集成到Quarkus中,并即将发布一个实验性的Quarkus扩展。请保持关注!
大多数基本Java类型现在可以索引
在HSEARCH-3047和HSEARCH-3503中,我们恢复了索引大多数基本Java类型的能力。
以下类型现在受支持:
-
java.lang.String
-
java.lang.Character
,char
-
java.lang.Byte
,byte
-
java.lang.Short
,short
-
java.lang.Integer
,int
-
java.lang.Long
,long
-
java.lang.Double
,double
-
java.lang.Float
,float
-
java.lang.Boolean
,boolean
-
java.net.URI
-
java.net.URL
-
java.time.Instant
-
java.time.LocalDate
-
java.time.LocalTime
-
java.time.LocalDateTime
-
java.time.OffsetDateTime
-
java.time.OffsetTime
-
java.time.ZonedDateTime
-
java.time.ZoneId
-
java.time.ZoneOffset
-
java.time.Period
-
java.time.Duration
-
java.time.Year
-
java.time.YearMonth
-
java.time.MonthDay
-
java.util.UUID
-
java.util.Calendar
-
java.util.Date
-
java.sql.Timestamp
-
java.sql.Date
-
java.sql.Time
目前唯一尚未支持的类型是 BigDecimal
和 BigInteger
。
更多信息请参阅文档
大多数搜索谓词现已实现
在Alpha2版本中,仅实现了部分搜索谓词
-
matchAll
-
id
-
bool
-
match
-
range
-
nested
-
空间 "within"(距离)
在 HSEARCH-3091 和 HSEARCH-3256 中,我们确保了在Search 6中实现了Search 5中大多数谓词选项(仅缺少 分析器覆盖)。
在 HSEARCH-3089 中,我们实现了以下谓词
-
phrase
-
wildcard
-
simpleQueryString
这使得我们几乎与Search 5相当,只缺少 facet
和 moreLikeThis
。
统一、更简洁的API
我们一直在努力使Search 6中的API变更真正有价值。
之前的版本确保API更强大,特别是允许安全地创建针对多个索引的谓词或创建类型安全的查询。
在本版本中,我们确保了命名更加一致、简洁且比Search 5中的命名更少冗余。
以下是一个在Search 5中编写的查询示例。
FullTextSession ftSession = Search.getFullTextSession(session);
QueryBuilder bookQb = ftSession.getSearchFactory().buildQueryBuilder().forEntity(Book.class).get();
QueryBuilder dvdQb = ftSession.getSearchFactory().buildQueryBuilder().forEntity(Dvd.class).get();
// Find all long documents: books with more than 500 pages or dvd lasting more than 2 hours
Query luceneQuery = bookQb.bool()
.should(bookQb.range().onField("pageCount").above(500).createQuery())
.should(dvdQb.range().onField("durationInMinutes").above(120).createQuery())
.createQuery();
FullTextQuery query = ftSession.createFullTextQuery(luceneQuery, Book.class, Dvd.class);
query.setMaxResults(pageSize).setFirstResult(selectedPage*pageSize); // Pagination
@SuppressWarnings("unchecked")
List<Document> results = query.list();
以下是在Search 6 Alpha1/Alpha2中的等效查询:没有更多针对类型的查询构建器,没有更多 "lucene query",没有更多必须强制类型转换的原始类型。
FullTextSession ftSession = Search.getFullTextSession(session);
FullTextQuery<Document> query = ftSession.search(Arrays.asList(Book.class, Dvd.class)).query().asEntity()
.predicate(f -> f.bool()
.should(f.range().onField("pageCount").above(500))
.should(f.range().onField("durationInMinutes").above(120))
.toPredicate()
)
.build();
query.setMaxResults(pageSize).setFirstResult(selectedPage*pageSize); // Pagination
List<Document> results = query.list();
以下是在Search 6 Alpha3中的等效查询:没有更多无意义的 query()
或 toPredicate()
调用,对所有类型的统一命名(以 Search
开头)以及统一的方法名称来检索结果(fetch
,fetchHits
,fetchCount
等)。
SearchSession searchSession = Search.getSearchSession(session);
SearchQuery<Document> query = searchSession.search(Arrays.asList(Book.class, Dvd.class)).asEntity()
.predicate(f -> f.bool()
.should(f.range().onField("pageCount").above(500))
.should(f.range().onField("durationInMinutes").above(120))
)
.toQuery();
List<Document> results = query.fetchHits(pageSize, selectedPage*pageSize);
有关详细信息,请参阅
-
HSEARCH-3444:减少谓词/投影/排序DSL和索引模式DSL的冗余
-
HSEARCH-3403:移除FullTextQuery/FullTextSession到相应Hibernate ORM类型的继承
-
HSEARCH-3498:将可选谓词DSL参数移动到终端上下文
-
HSEARCH-3511:使Search API的入口点更直观
我们还更改了在桥梁中向文档添加值的语法:请参阅 HSEARCH-3295。
最后,我们使Elasticsearch和Lucene后端之间的配置属性名称更一致:HSEARCH-3482。
文档
文档内容仍然较少,但仍在不断增长。我们特别记录了配置属性(HSEARCH-3473,见此处)和从 java.util
使用日期/时间类型的限制(HSEARCH-3509,见此处)。
版本升级
-
HSEARCH-3483:升级到 Lucene 7.7.0
-
HSEARCH-3520:升级到 Elasticsearch 6.6.2
-
HSEARCH-3490:现在实验性地支持 Elasticsearch 7.0.0-beta1。
-
HSEARCH-3514:我们将自动模块名称恢复到我们的 JAR 中,因此可以从您的
module-info.java
安全地引用。附录(2019-04-05):发现仍然存在从 Java 模块使用 Hibernate Search 的问题。见HSEARCH-3551。
-
HSEARCH-3485,HSEARCH-3493:Hibernate Search 仍针对 JDK8 和 JDK11,但现在我们也定期测试与 JDK12 和 JDK13 的兼容性。
其他改进和错误修复
-
HSEARCH-3424:展示模块现在使用 Spring Boot,以展示如何在应用程序中使用 Hibernate Search 的示例。见GitHub 上的代码。
-
HSEARCH-3257:允许在投影中绕过桥梁
-
HSEARCH-2658:支持在所有用户提供的组件中使用 @Inject:桥梁、配置器等
-
HSEARCH-1640:布尔字段永远不会被分析
-
HSEARCH-2908:对 'java.lang.Short and java.lang.Byte' 字段的 Elasticsearch 映射不正确
-
HSEARCH-3481:将 max_connections_per_route 的默认值更改为 10
-
HSEARCH-3251:在 Elasticsearch 中避免“模糊”查询,并优先使用带有“fuzziness”参数的“匹配”查询
-
HSEARCH-2248:从 DSL 中删除模糊查询的过时阈值方法
-
HSEARCH-3477:在 Lucene 后端跨不同索引查询全文字段时出现不兼容的类型错误
-
HSEARCH-3489:当 Hibernate Search 找不到关联的逆端时,改进错误消息
-
HSEARCH-3529:MassIndexer 对于具有原始 ID 类型的实体失败
等等。有关自上次发布以来所有更改的完整列表,请参阅发行说明。
如何获取此版本
所有详细信息均可在 hibernate.org 上的专用页面 上找到并更新。