Hibernate Search 是一个库,它通过自动索引实体,将 Hibernate ORM 与 Apache Lucene 或 Elasticsearch 集成,从而启用高级搜索功能:全文搜索、地理空间搜索、聚合等。更多信息请参阅 hibernate.org 上的 Hibernate Search。

我们刚刚发布了 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-2726HSEARCH-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工作。我们不提供用户消费的包,但如果你是集成者,或者只是想看看,你可以查看我们的集成测试

还有更多!

其他显著变更的摘要

  • 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-2665IndexingInterceptor不再被认为是实验性的。

  • HSEARCH-2666IndexControlMBean不再被认为是实验性的。

有关自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的下载也可用。

反馈、问题、想法?

要取得联系,请使用以下渠道


返回顶部