1.启动ES
1.1 安装elasticsearch
通过下面的Docker命令即可安装单机版本的elasticsearch:
1 | #先在tar所在目录下打开cmd |
启动之后访问http://localhost:9200/就可以看到elasticsearch信息:
1.2 安装Kibana
通过下面的Docker命令,即可部署Kibana:
1 | #先在tar所在目录下打开cmd |
启动之后访问http://localhost:5601/就可以通过kibana数据化访问elasticsearch:
可以点击右上角Dev tools,进入开发工具页面:
点击之后:
2.改造操作步骤
在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient
的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。
2.1 初始化RestClient
2.1.1 引入RestHighLevelClient依赖
在微服务模块中引入es
的RestHighLevelClient
依赖:
1 | <dependency> |
2.1.2 覆盖ES版本
因为SpringBoot默认的ES版本是7.17.10
,所以我们需要覆盖默认的ES版本【黑马商城是在pom.xml中修改】:
1 | <properties> |
2.1.3 初始化RestHighLevelClient
1 | RestHighLevelClient client = new RestHighLevelClient( |
2.2 分析Mysql设计ES实现
我们针对购物车数据库进行分析:
我们可以对购物车的所有字段进行分析,判断哪些字段必须添加到ElasticSearch中,判断哪些字段必须添加搜索功能。从而进行新建索引库和映射:
具体代码:
1 | PUT /items |
2.3 索引库操作(client.indices.xxx)
JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()
方法来获取索引库的操作对象。
索引库操作的基本步骤:
- 1.初始化RestHighLevelClient类对象client【创建客户端】
- 2.创建XxxIndexRequest对象request【XXX是
Create
、Get
、Delete
】 - 3.准备请求参数request.source()方法【只有新增
Create
需要参数,其他情况不需要】 - 4.发送请求client.indices().xxx()方法【xxx是
create
、exists
、delete
】
2.3.1 创建索引库
2.3.2 删除索引库
2.3.2 查询索引库
2.4 文档操作(client.xxx)
文档操作的基本步骤:
- 1.初始化RestHighLevelClient类对象client【创建客户端】
- 2.创建XxxRequest对象request【Xxx是
Index
、Update
、Delete
、Bulk
】 - 3.准备请求参数request.source()方法(
Index
、Update
、Bulk
时需要) - 4.发送请求client.Xxx()方法【Xxx是
index
、get
、update
、delete
、bulk
】 - 5.解析结果(
Get
查询时需要,数据在_source内部)
2.4.1 新增文档
- 1.创建Request对象,这里是
IndexRequest
,因为添加文档就是创建倒排索引的过程 - 2.准备请求参数,本例中就是Json文档
- 3.发送请求【client.index()方法就好了】
2.4.2 查询文档
与之前的流程类似,代码大概分2步:
- 创建Request对象
- 准备请求参数,这里是无参,【直接省略】
- 发送请求
- 解析结果【因为结果在_source部分内】
可以看到,响应结果是一个JSON,其中文档放在一个_source
属性中,因此解析就是拿到_source
,反序列化为Java对象即可
2.4.3 删除文档
与查询相比,仅仅是请求方式从DELETE
变成GET
,可以想象Java代码应该依然是2步走:
- 1)准备Request对象,因为是删除,这次是
DeleteRequest
对象。要指定索引库名和id - 2)准备参数,无参,直接省略
- 3)发送请求。因为是删除,所以是
client.delete()
方法
2.4.4 修改文档
修改我们讲过两种方式:
- 全量修改:本质是先根据id删除,再新增【与新增文档】
- 局部修改:修改文档中的指定字段值
在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:
- 如果新增时,ID已经存在,则修改
- 如果新增时,ID不存在,则新增
这里不再赘述,我们主要关注局部修改的API即可
2.4.5 批量导入文档
因此BulkRequest
中提供了add
方法,用以添加其它CRUD的请求:
具体代码:
2.5 高级查询
文档搜索的基本步骤是:
- 创建
SearchRequest
对象实例request - 准备
request.source()
,也就是DSL语句【这个位置可以创建查询,分页,排序,聚合,高亮等操作】QueryBuilders
来构建查询条件- 传入
request.source()
的query()
方法
- 发送请求,得到结果
- 解析结果(参考DSL查询得到的JSON结果,从外到内,逐层解析)
2.5.1 查询数据
我们可以分三步拼凑DSL语句和发起请求获取相应结果:
其中2.组织DSL参数的步骤中source()方法下面对应的查询/高亮/分页/排序/聚合:
在查询方面我们直接可以通过QueryBuilders类调用对应的叶子查询/复杂查询
2.5.2 解析数据
我们可以通过响应结果和Elasticsearch页面返回结果获取具体细节: 【可以扩展很多,但其实就是对照DSL查询结果写】
黑马的图:
3.代码实现思路
==基础操作==
1.引入RestHighLevelClient依赖
2.初始化RestHighLevelClient
1 | RestHighLevelClient client = new RestHighLevelClient( |
- 3.针对索引库(数据库表)操作【创建,查询,修改,删除】
1 | 索引库操作的基本步骤: |
- 4.针对文档(每一行数据)操作【创建,查询,修改,删除】
1 | 文档操作的基本步骤: |
==高级操作(复杂的DSL查询)==
5.在具体位置就可以进行复杂的DSL查询【可以进行查询,分页,排序,高亮,聚合等操作】
1 | 文档搜索的基本步骤是: |