前言
在前边我们探讨了ES的基本概念以及根据不同的场景选择数据迁移的方案。在这一篇我们来探讨如何与Spring boot集成,以及为了平滑地从Mysql
迁移到ES中我们如何”翻译SQL
“。
一、Spring Boot集成ES
第一步我们就要实现Spring boot和ES集成,在Spring boot中主要有Java REST Client
、spring-data-elasticsearch
两种方式,这里我建议使用Elasticsearch官方提供的Java High Level REST Client
来集成,也方便在生产环境中使用阿里云的ES云服务。关键的版本信息如下:
ES集群:7.3.0
ES相关依赖:7.3.0
这里有两点需要注意:
High Level Client
能够向上兼容,例如7.3.0版本的Java High Level REST Client
能确保与大于等于7.3.0版本的Elasticsearch
集群通信。为了保证最大程度地使用最新版客户端的特性,推荐High Level Client版本与集群版本一致。在集成的过程中可能会踩到一些坑,因为
Spring Boot
的版本、ES
集群的版本、High Level Client
的版本之间会存在”关联关系“,所以当Demo无法正常跑起来的时候能做的就是多尝试一些High Level Client
版本。
1、pom依赖
org.elasticsearch.clientelasticsearch-rest-high-level-client7.3.0
org.elasticsearchelasticsearch7.3.0
org.elasticsearch.clientelasticsearch-rest-client7.3.0
org.elasticsearch.pluginrank-eval-client7.3.0
org.elasticsearch.pluginlang-mustache-client7.3.0
复制代码
2、初始化客户端
@Configuration
public class EsConfig {
@Value("${elasticsearch.host}")
public String host;
/**
* 之前使用transport的接口的时候是9300端口,现在使用HighLevelClient则是9200端口
*/
@Value("${elasticsearch.port:9200}")
public int port;
public static final String SCHEME = "http";
@Value("${elasticsearch.username:admin}")
public String username;
@Value("${elasticsearch.authenticationPassword}")
public String authenticationPassword;
@Bean(name = "remoteHighLevelClient")
public RestHighLevelClient restHighLevelClient() {
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username,
authenticationPassword));
RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, SCHEME)).
setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
.setDefaultCredentialsProvider(credentialsProvider));
return new RestHighLevelClient(builder);
}
}
复制代码
在上边的代码中需要注意username和authenticationPassword的认证信息都是在Kibana
中设置的。
二、Java API
下面的代码片段均能在单元测试中正常运行,在执行下边的单元测试之前,我们先创建一个_template
,大家可以选择在Kibana提供的Dev Tools
里边执行。
PUT _template/hero_template
{
"index_patterns&