我们刚刚发布了 Hibernate Search 版本 5.8.0.Beta3,它对 5.8.0.Beta2 进行了错误修复和改进,但还增加了新功能,如 分析器提供程序、归一化器、AWS 兼容性 和 依赖注入框架的 SPI 集成!
Hibernate Search 5.8.x 与 5.7.x 一样,仅与 Hibernate ORM 5.2.3 及更高版本兼容。 如果您需要使用 Hibernate ORM 5.0.x 或 5.1.x,请使用较旧的 Hibernate Search 5.6.x。 |
关于 5.8
Hibernate Search 5.8 主要关于
-
使 Elasticsearch 集成与 Elasticsearch 5.x 兼容(已完成);
-
提高 Elasticsearch 集成的性能(进行中);
-
引入一个新的 DSL 用于定义分析器(已完成);
-
确保 Hibernate Search 能够与 Java 9 兼容(已完成,尽管 Java 9 可能还会发生变化);
-
改进并记录 WildFly Swarm 集成(讨论中);
-
在 JMS/JGroups 集成中删除主节点上的类定义需求(讨论中);
-
当然,修复已报告的错误。
您可以通过 路线图 了解更多详细信息。
自 Beta2 以来有哪些新功能?
程序化分析器定义
现在您可以使用分析器定义提供程序以程序化方式(无需使用注释)定义分析器,全局定义(无需在特定实体上放置定义),以及以原生方式(无需使用 Lucene 类配置 Elasticsearch 分析器)。
例如,对于Lucene,你的LuceneAnalysisDefinitionProvider
可能看起来像这样
public static class CustomAnalyzerProvider implements LuceneAnalysisDefinitionProvider {
@Override
public void register(LuceneAnalyzerDefinitionRegistryBuilder builder) {
builder
.analyzer( "myAnalyzer" )
.tokenizer( StandardTokenizerFactory.class )
.charFilter( MappingCharFilterFactory.class )
.param( "mapping", "org/hibernate/search/test/analyzer/mapping-chars.properties" )
.tokenFilter( ASCIIFoldingFilterFactory.class )
.tokenFilter( LowerCaseFilterFactory.class )
.tokenFilter( StopFilterFactory.class )
.param( "mapping", "org/hibernate/search/test/analyzer/stoplist.properties" )
.param( "ignoreCase", "true" );
}
}
而对于Elasticsearch,你会使用
public static class CustomAnalyzerProvider implements ElasticsearchAnalysisDefinitionProvider {
@Override
public void register(ElasticsearchAnalysisDefinitionRegistryBuilder builder) {
builder.analyzer( "tweet_analyzer" )
.withTokenizer( "whitespace" )
.withCharFilters( "custom_html_strip" )
.withCharFilters( "p_br_as_space" );
builder.charFilter( "custom_html_strip" )
.type( "html_strip" )
.param( "escaped_tags", "br", "p" );
builder.charFilter( "p_br_as_space" )
.type( "pattern_replace" )
.param( "pattern", "<p/?>|<br/?>" )
.param( "replacement", " " )
.param( "tags", "CASE_INSENSITIVE" );
}
}
如您所见,这允许你避免在配置Elasticsearch分析器时需要引用Lucene类。
更多详细信息请参见这里关于Lucene和这里关于Elasticsearch。
用于更安全排序的规范器
在HSEARCH-2726和HSEARCH-2659中,我们引入了规范器:不执行任何类型的分词的分析器。
我们毫不掩饰地从Elasticsearch中借鉴了这个概念,但在嵌入式Lucene模式和Elasticsearch模式下都实现了它。规范器对于可排序的字段很有用:当字段可排序时,它不应该进行分词,因为这会使排序顺序不可预测;排序可能只适用于幸运的第一个标记,但也可能适用于任何其他标记。
从5.8.0.Beta3版本开始,Hibernate Search将在你使用分析器对可排序字段进行操作时记录警告。要解决此警告,请将分析器定义更改为规范器。
在Lucene中,规范器只是起辅助作用,它们的工作方式与分析器完全一样。两者之间的区别是,在定义规范器时不能将分词器影响规范器,并且规范器有一个运行时安全网:如果你设法创建了多个标记,Hibernate Search将它们连接回单个标记并记录一个警告。
在Elasticsearch 5.2及更高版本中,规范器将转换为原生的Elasticsearch规范器,并且具有规范器的文本字段将采用keyword
数据类型。
在Elasticsearch 5.1及以下版本中,原生规范器不可用,因此规范器将简单地转换为分析器,并且具有规范器的文本字段将采用text
(5.x)或string
(2.x)数据类型。
你可以在参考文档中了解更多关于规范器的信息
AWS兼容性
AWS需要在HTTP请求中特定的动态计算出的标题来处理身份验证,这至今使得使用托管在AWS上的Elasticsearch与Hibernate Search结合变得困难。
我们引入了一个新的SPI,允许对HTTP客户端进行低级配置,这允许你插入执行所需AWS身份验证的代码;这个SPI也可以用于与其他云服务提供商集成。
我们目前已经在AWS管理的Elasticsearch集群上成功运行了所有测试套件,并且启用了安全功能。
目前,SPI是可用的,但我们尚未发布签名组件;这将在下一个里程碑中提供:如果你想要帮助,请参见引入AWS模块!
FieldBridges中的依赖注入
作为HSEARCH-1316的一部分,我们正在尝试与各种依赖注入框架集成。
集成允许你在FieldBridges中使用诸如@Inject
、@PostConstruct
等注解,例如,在索引给定bean时,这可能允许你从应用程序中获取额外的数据。
目前已知集成与Spring DI和CDI工作。我们不提供用户消费的包,但如果你是集成者,或者只是想看看,你可以查看我们的集成测试
-
WildFly: 集成本身,以及一个Java服务,可以将集成插入到Hibernate Search中。
-
Spring Boot: 本身集成,一个Java服务,用于将集成插入Hibernate Search,以及bean工厂的配置。
还有更多!
其他显著变更的摘要
-
HSEARCH-2606:现在正确考虑了
discovery_scheme
配置属性。感谢Matthieu Vincent报告并修复此问题! -
HSEARCH-2477:现在在Elasticsearch上可以正常工作。
-
HSEARCH-2603:现在在Elasticsearch 5+上执行空间搜索时使用Painless脚本语言。顺便说一下,这意味着在Elasticsearch 5+上不再需要执行任何服务器端配置即可执行任何空间查询。
-
HSEARCH-2734:由于存在很多混淆和不正确(有害)的使用,我们已废弃了“ram”名称用于
RAMDirectory
目录提供程序。如果需要,请确保您在生产环境中没有使用它,阅读有关其限制的参考文档,并使用其新名称:“local-heap”。 -
HSEARCH-2735:索引时间提升功能(
@Boost
,@DynamicBoost
)已被废弃,没有替代方案,并且需要在未来的版本中删除,因为Lucene 7不再允许索引时间提升。请参阅参考文档中的替代方案:建议切换到查询时间提升。 -
HSEARCH-2665:
IndexingInterceptor
不再被认为是实验性的。 -
HSEARCH-2666:
IndexControlMBean
不再被认为是实验性的。
有关自5.8.0.Beta2以来的完整变更列表,请参阅发布说明。
如何获取此版本
所有版本均可在Hibernate Search的网站上找到。
理想情况下,使用工具从Maven central获取;这些是坐标
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>5.8.0.Beta3</version>
</dependency>
要使用实验性的Elasticsearch集成,您还需要
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-elasticsearch</artifactId>
<version>5.8.0.Beta3</version>
</dependency>
来自Sourceforge的下载也可用。