Elasticsearch-黑马商城为例

1.启动ES

1.1 安装elasticsearch

通过下面的Docker命令即可安装单机版本的elasticsearch:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#先在tar所在目录下打开cmd
docker load -i es.tar

#创建一个网络【不然kibana不能连接es,踩坑了!!】
docker network create elastic

#黑马安装:
docker run -d \
--name es \
-e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ #配置jvm的内存
-e "discovery.type=single-node" \ #配置运行模式【单点模式/集群模式】
-v es-data:/usr/share/elasticsearch/data \ #挂载
-v es-plugins:/usr/share/elasticsearch/plugins \
--privileged \
--network hm-net \
-p 9200:9200 \ #访问http端口
-p 9300:9300 \ #集群使用
elasticsearch:7.12.1

#csdn安装:
docker run -d --name es -e ES_JAVA_OPTS="-Xms512m -Xmx512m" -e "discovery.type=single-node" --privileged --network elastic -p 9200:9200 -p 9300:9300 elasticsearch:7.12.1

启动之后访问http://localhost:9200/就可以看到elasticsearch信息:

image-20240507204417602

1.2 安装Kibana

通过下面的Docker命令,即可部署Kibana:

1
2
3
4
5
6
7
8
9
10
11
12
13
#先在tar所在目录下打开cmd
docker load -i kibana.tar

#黑马安装:
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \ #es的地址,这里的es要和es配置docker的时候--name一致
--network=hm-net \ #网络和es一个网络
-p 5601:5601 \
kibana:7.12.1 #要保证和es版本一致!!!

#csdn安装:
docker run -d --name kibana -e ELASTICSEARCH_HOSTS=http://es:9200 --network elastic -p 5601:5601 kibana:7.12.1

启动之后访问http://localhost:5601/就可以通过kibana数据化访问elasticsearch:

image-20240507204635028

可以点击右上角Dev tools,进入开发工具页面:

image-20240507204914788

点击之后:

image-20240507205135009

2.改造操作步骤

在elasticsearch提供的API中,与elasticsearch一切交互都封装在一个名为RestHighLevelClient的类中,必须先完成这个对象的初始化,建立与elasticsearch的连接。

2.1 初始化RestClient

2.1.1 引入RestHighLevelClient依赖

在微服务模块中引入esRestHighLevelClient依赖:

1
2
3
4
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

2.1.2 覆盖ES版本

因为SpringBoot默认的ES版本是7.17.10,所以我们需要覆盖默认的ES版本【黑马商城是在pom.xml中修改】:

1
2
3
4
5
6
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<!--覆盖成7.12.1-->
<elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

2.1.3 初始化RestHighLevelClient

1
2
3
4
5
6
RestHighLevelClient client = new RestHighLevelClient(
//使用RestClient的builder方法创建
RestClient.builder(
HttpHost.create("http://192.168.xxx.xxx:9200")
)
);

2.2 分析Mysql设计ES实现

我们针对购物车数据库进行分析:

image-20240520172813812

我们可以对购物车的所有字段进行分析,判断哪些字段必须添加到ElasticSearch中,判断哪些字段必须添加搜索功能。从而进行新建索引库和映射:

image-20240520171754450

具体代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
PUT /items
{
"mappings": {
"properties": {
"id": {
"type": "keyword"
},
"name":{
"type": "text",
"analyzer": "ik_max_word"
},
"price":{
"type": "integer"
},
"stock":{
"type": "integer"
},
"image":{
"type": "keyword",
"index": false
},
"category":{
"type": "keyword"
},
"brand":{
"type": "keyword"
},
"sold":{
"type": "integer"
},
"commentCount":{
"type": "integer",
"index": false
},
"isAD":{
"type": "boolean"
},
"updateTime":{
"type": "date"
}
}
}
}

2.3 索引库操作(client.indices.xxx)

JavaRestClient操作elasticsearch的流程基本类似。核心是client.indices()方法来获取索引库的操作对象。

索引库操作的基本步骤:

  • 1.初始化RestHighLevelClient类对象client【创建客户端】
  • 2.创建XxxIndexRequest对象request【XXX是CreateGetDelete
  • 3.准备请求参数request.source()方法【只有新增Create需要参数,其他情况不需要】
  • 4.发送请求client.indices().xxx()方法【xxx是createexistsdelete

2.3.1 创建索引库

image-20240520173351287

2.3.2 删除索引库

image-20240521135115905

2.3.2 查询索引库

2.4 文档操作(client.xxx)

文档操作的基本步骤:

  • 1.初始化RestHighLevelClient类对象client【创建客户端】
  • 2.创建XxxRequest对象request【Xxx是IndexUpdateDeleteBulk
  • 3.准备请求参数request.source()方法(IndexUpdateBulk时需要)
  • 4.发送请求client.Xxx()方法【Xxx是indexgetupdatedeletebulk
  • 5.解析结果(Get查询时需要,数据在_source内部)

2.4.1 新增文档

  • 1.创建Request对象,这里是IndexRequest,因为添加文档就是创建倒排索引的过程
  • 2.准备请求参数,本例中就是Json文档
  • 3.发送请求【client.index()方法就好了】

image-20240521142712455

2.4.2 查询文档

与之前的流程类似,代码大概分2步:

  • 创建Request对象
  • 准备请求参数,这里是无参,【直接省略】
  • 发送请求
  • 解析结果【因为结果在_source部分内】

image-20240521142844007

可以看到,响应结果是一个JSON,其中文档放在一个_source属性中,因此解析就是拿到_source,反序列化为Java对象即可

2.4.3 删除文档

与查询相比,仅仅是请求方式从DELETE变成GET,可以想象Java代码应该依然是2步走:

  • 1)准备Request对象,因为是删除,这次是DeleteRequest对象。要指定索引库名和id
  • 2)准备参数,无参,直接省略
  • 3)发送请求。因为是删除,所以是client.delete()方法

image-20240521143043972

2.4.4 修改文档

修改我们讲过两种方式:

  • 全量修改:本质是先根据id删除,再新增【与新增文档】
  • 局部修改:修改文档中的指定字段值

在RestClient的API中,全量修改与新增的API完全一致,判断依据是ID:

  • 如果新增时,ID已经存在,则修改
  • 如果新增时,ID不存在,则新增

这里不再赘述,我们主要关注局部修改的API即可

image-20240521143147541

2.4.5 批量导入文档

因此BulkRequest中提供了add方法,用以添加其它CRUD的请求:

image-20240521144140401

具体代码:

image-20240521143955532

2.5 高级查询

文档搜索的基本步骤是:

  1. 创建SearchRequest对象实例request
  2. 准备request.source(),也就是DSL语句【这个位置可以创建查询,分页,排序,聚合,高亮等操作】
    1. QueryBuilders来构建查询条件
    2. 传入request.source()query()方法
  3. 发送请求,得到结果
  4. 解析结果(参考DSL查询得到的JSON结果,从外到内,逐层解析)

2.5.1 查询数据

我们可以分三步拼凑DSL语句和发起请求获取相应结果:

image-20240522172046658

其中2.组织DSL参数的步骤中source()方法下面对应的查询/高亮/分页/排序/聚合:
image-20240522172832347

在查询方面我们直接可以通过QueryBuilders类调用对应的叶子查询/复杂查询

image-20240522172921305

2.5.2 解析数据

我们可以通过响应结果和Elasticsearch页面返回结果获取具体细节: 【可以扩展很多,但其实就是对照DSL查询结果写

image-20240522173851593

黑马的图:

image-20240522173920457

3.代码实现思路

==基础操作==

  • 1.引入RestHighLevelClient依赖

  • 2.初始化RestHighLevelClient

1
2
3
4
5
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
HttpHost.create("http://192.168.xxx.xxx:9200") //使用RestClient的builder方法创建
)
);
  • 3.针对索引库(数据库表)操作【创建,查询,修改,删除】
1
2
3
4
5
索引库操作的基本步骤:
- 1.初始化RestHighLevelClient类对象client【创建客户端】
- 2.创建XxxIndexRequest对象request【XXX是`Create`、`Get`、`Delete`】
- 3.准备请求参数request.source()方法【只有新增`Create`需要参数,其他情况不需要】
- 4.发送请求client.indices().xxx()方法【xxx是`create`、`exists`、`delete`】
  • 4.针对文档(每一行数据)操作【创建,查询,修改,删除】
1
2
3
4
5
6
文档操作的基本步骤:
- 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内部)

==高级操作(复杂的DSL查询)==

5.在具体位置就可以进行复杂的DSL查询【可以进行查询,分页,排序,高亮,聚合等操作】

1
2
3
4
5
6
7
文档搜索的基本步骤是:
1. 创建`SearchRequest`对象实例request
2. 准备`request.source()`,也就是DSL语句【这个位置可以创建查询,分页,排序,聚合,高亮等操作】
1. `QueryBuilders`来构建查询条件
2. 传入`request.source()` 的` query() `方法
3. 发送请求,得到结果
4. 解析结果(参考DSL查询得到的JSON结果,从外到内,逐层解析)

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 1.启动ES
    1. 1.1. 1.1 安装elasticsearch
    2. 1.2. 1.2 安装Kibana
  2. 2. 2.改造操作步骤
    1. 2.1. 2.1 初始化RestClient
      1. 2.1.1. 2.1.1 引入RestHighLevelClient依赖
      2. 2.1.2. 2.1.2 覆盖ES版本
      3. 2.1.3. 2.1.3 初始化RestHighLevelClient
    2. 2.2. 2.2 分析Mysql设计ES实现
    3. 2.3. 2.3 索引库操作(client.indices.xxx)
      1. 2.3.1. 2.3.1 创建索引库
      2. 2.3.2. 2.3.2 删除索引库
      3. 2.3.3. 2.3.2 查询索引库
    4. 2.4. 2.4 文档操作(client.xxx)
      1. 2.4.1. 2.4.1 新增文档
      2. 2.4.2. 2.4.2 查询文档
      3. 2.4.3. 2.4.3 删除文档
      4. 2.4.4. 2.4.4 修改文档
      5. 2.4.5. 2.4.5 批量导入文档
    5. 2.5. 2.5 高级查询
      1. 2.5.1. 2.5.1 查询数据
      2. 2.5.2. 2.5.2 解析数据
  3. 3. 3.代码实现思路
    1. 3.1. ==基础操作==
    2. 3.2. ==高级操作(复杂的DSL查询)==
,