我们在之前的课程中,已经实现了我们基础的微服务框架的建设。现在,我们可能又会遇到以下问题。
那就是我们搜索速度的问题,比如我们想在数据库里面使用关建字搜索怎么办?有人可以说使用mysql直接搜索呀。可是问题来了如果你的数据量很大比如上千万,上亿条,那你不管如果去优化代码,mysql的查询也肯定是秒级的。
这个问题就引出了我们的ElasticSearch.
什么是ElasticSearch
ElasticSearch本质上是一个数据库,它是一个专门为搜索而生的数据库。它本质是基于倒排排序所设计的数据库。其就是通过将文章里面的词建档,而每个词都有独立的id。所以,进行模糊查询的时候自然就很快了。
这个数据库可以取代mysql吗?不,正常情况下他们都是共生的关系,我们将MySQL作为业务数据库,ES作为查询数据库,用来实现读写分离,缓解MySQL数据库的查询压力,应对海量数据的复杂查询。你看下面的一张图就知道了。
不过,话也说会来了。ES也只是在一些大公司里面才会用到。一般面试的话,面试官也不会问。所以嘛,那就我们主要讲如何应用吧。至于底层是怎么使用的,我们就不讲了。
springboot整合ElasticSearch
微服务我们讲了这么多,但是通用的一点就是每个功能就是一个微服务,ES也不例外,我们想使用ES进行查询的话,就相当于我们新建了一个微服务。
1.使用spring 初始化工具,创建我们的项目点击下一步
2.导入我们的依赖项
引入我们依赖
1 RestHighLevelClient介绍
默认情况下,ElasticSearch使用两个端口来监听外部TCP流量。
9200端口:用于所有通过HTTP协议进行的API调用。包括搜索、聚合、监控、以及其他任何使用HTTP协议的请求。所有的客户端库都会使用该端口与ElasticSearch进行交互。
9300端口:是一个自定义的二进制协议,用于集群中各节点之间的通信。用于诸如集群变更、主节点选举、节点加入/离开、分片分配等事项。
RestHighLevelClient是ES的Java客户端,它是通过HTTP与ES集群进行通信。
<!--引入es-high-level-client相关依赖 start-->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.10.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.10.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.0</version>
</dependency>
<!--引入es-high-level-client相关依赖 end-->
加入我们的ES配置
# es配置
# es用户名
elasticsearch.userName=elastic
# es密码
elasticsearch.password=elastic
# es host ip 地址(集群),多个以","间隔
elasticsearch.hosts=127.0.0.1:9200
# es 请求方式
elasticsearch.scheme=http
# es 连接超时时间(ms)
elasticsearch.connectTimeOut=1000
# es socket 连接超时时间(ms)
elasticsearch.socketTimeOut=30000
# es 请求超时时间(ms)
elasticsearch.connectionRequestTimeOut=500
# es 最大连接数
elasticsearch.maxConnectNum=100
# es 每个路由的最大连接数
elasticsearch.maxConnectNumPerRoute=100
想象一下,我们如果是一名高达驾驶员,我们要操作高达我们需要一些什么?
当然是应该驾驶室了!
这个也一样,我们要操作这个的第一步就是创建我们的client.
Connectingedit
You can connect to the Elastic Cloud using an API key and the Elasticsearch endpoint
// URL and API key
String serverUrl = "https://localhost:9200";
String apiKey = "VnVhQ2ZHY0JDZGJrU...";
// Create the low-level client
RestClient restClient = RestClient
.builder(HttpHost.create(serverUrl))
.setDefaultHeaders(new Header[]{
new BasicHeader("Authorization", "ApiKey " + apiKey)
})
.build();
// Create the transport with a Jackson mapper
ElasticsearchTransport transport = new RestClientTransport(
restClient, new JacksonJsonpMapper());
// And create the API client
ElasticsearchClient esClient = new ElasticsearchClient(transport);