spring boot + hibernate搜索+弹性搜索嵌入式无法启动

时间:2016-06-20 19:07:13

标签: elasticsearch spring-boot hibernate-search

我在弹簧启动设置中使用弹性搜索后端来设置hibernate seach。

我所拥有的是spring boot和以下依赖项。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>1.4.0.M3</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search-backend-elasticsearch</artifactId>
        <version>5.6.0.Alpha3</version>
</dependency>

在弹性搜索完成开始之前,hibernate搜索会初始化。

使用以下属性也会公开其余界面

spring:
   data:
      elasticsearch:
         properties:
            http:
               enabled: true

导致异常

  

引起:org.apache.http.conn.HttpHostConnectException:连接到localhost:9200 [localhost / 127.0.0.1,localhost / 0:0:0:0:0:0:0:1]失败:连接被拒绝:连接

现在,我如何在这里定义一个依赖?

我尝试使用自定义BeanFactoryPostProcessor来为弹性搜索注入依赖关系,但在自动配置方案中似乎忽略了这一点。

有没有办法引入等待弹性搜索?

设置工作正常,当我将休眠index_management_strategy设置为NONE时,但是未配置索引并且忽略所有自定义分析器注释,默认为弹性搜索中的默认映射,这可以未在自动配置方案中配置。

理想情况下,弹性搜索应该在jvm外部托管,但在测试场景中它很方便。

3 个答案:

答案 0 :(得分:2)

我理解这是您在集成测试期间遇到的问题。

你可以看看我们如何在Hibernate Search本身的集成测试中启动ES,使用Maven插件确保服务器在测试之前启动: - https://github.com/hibernate/hibernate-search/blob/5.6.0.Beta1/elasticsearch/pom.xml#L341-L368

N.B。这使用自定义ES配置,即使它只是单个节点集群,也可以快速启动:   - https://raw.githubusercontent.com/hibernate/hibernate-search/5.6.0.Beta1/elasticsearch/elasticsearchconfiguration/elasticsearch.yml

Hibernate Search使用Jest客户端连接到ES,因此需要您启用ES的HTTP连接器:不要将它与NodeClient混淆,后者是一种不同的操作模式。

如果你的问题与自动化测试有关,而与生产集群无关,那么我建议使用像Kubernetes这样的服务编排器。

答案 1 :(得分:2)

感谢Spring boot团队提供的一些帮助,我能够解决问题 - 解决方案here

  

问题是EntityManagerFactory bean和Elasticsearch Client bean之间没有依赖关系,所以不能保证Elasticsearch会在Hibernate之前启动。碰巧的是,Hibernate首先启动,然后无法连接到Elasticsearch。

这可以通过在两个bean之间设置依赖关系来解决。一个简单的方法是使用EntityManagerFactoryDependsOnPostProcessor的子类:

@Configuration
static class ElasticsearchJpaDependencyConfiguration extends EntityManagerFactoryDependsOnPostProcessor {

    public ElasticsearchJpaDependencyConfiguration() {
        super("elasticsearchClient");
    }

}

现在所需要的只是将副本数设置为0以修复单节点部署中群集的运行状况。这可以通过在application.properties文件

中指定其他属性来完成
spring.data.elasticsearch.properties.index.number_of_replicas= 0

答案 2 :(得分:1)

我检查了sprint-data文档,看起来你误解了这篇文章(实际上它很混乱,伙计们不理解下面的技术?)

  

默认情况下,实例将尝试连接到本地内存服务器(Elasticsearch术语中的NodeClient),但您可以通过设置spring.data.elasticsearch.cluster-nodes切换到远程服务器(即TransportClient)。以逗号分隔的'host:port'列表。

NodeClient不是“本地服务器”,它是 ES客户端的特殊类型。此本地客户端可以连接到包含数据的ES集群节点,正如我在评论中所说,您没有运行任何ES数据节点。 阅读本文以便更好地理解https://www.elastic.co/guide/en/elasticsearch/guide/current/_transport_client_versus_node_client.html