我在弹簧启动设置中使用弹性搜索后端来设置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外部托管,但在测试场景中它很方便。
答案 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