微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

🔥博客主页: 【小扳_-CSDN博客】
❤感谢大家点赞👍收藏⭐评论✍

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

文章目录

1.0 索引库操作

1.1 Mapping 映射属性

1.2 索引库的 CRUD

1.2.1 创建索引和映射

1.2.2 查询索引库

1.2.3 修改索引库

1.2.4 删除索引库

2.0 文档操作

2.1 新增文档

2.2 查询文档

2.3 删除文档

2.4 修改文档

2.4.1 全量修改

2.4.2 局部修改

2.5 批处理

3.0 RestAPI

3.1 初始化 RestClient

3.2 创建索引库

3.3 删除索引库

3.4 判断索引库是否存在

4.0 RestClient 操作文档

4.1 新增文档

4.2 查询文档

4.3 删除文档

4.4 修改文档

4.5 批量导入文档


1.0 索引库操作

Index 就类似数据库表,Mapping 映射就类似表的结构。要向 es 中存储数据,必须先创建

Index 和 Mapping 。

1.1 Mapping 映射属性

Mapping 是对索引库中文档的约束,常见的 Mapping 属性包括:

type:字段数据类型,常见的简单类型有:

1) 字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)

数值:long、integer、short、byte、double、float

布尔:boolean

日期:date

对象:object

2) index:是否创建索引,默认为true

3) analyzer:使用哪种分词器

4) properties:该字段的子字段

1.2 索引库的 CRUD

由于 Elasticsearch 采用的是 Restful 风格的 API,因此其请求方式和路径相对都比较规范,

而且请求参数也都采用 JSON 风格。

直接基于 Kibana 的 DevTools 来编写请求做测试,由于有语法提示,会非常方便。

1.2.1 创建索引和映射

基本语法:

1)请求方式:PUT

2)请求路径:/ 索引库名,可以自定义

3)请求参数:mapping 映射

格式如下:

```javascript
PUT /索引库名称
{
  "mappings": {
    "properties": {
      "字段名":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "字段名2":{
        "type": "keyword",
        "index": "false"
      },
      "字段名3":{
        "properties": {
          "子字段": {
            "type": "keyword"
          }
        }
      },
      // ...略
    }
  }
}
```

举个例子:

```javascript
PUT /xbs
{
  "mappings": {
    "properties": {
      "msg":{
        "type": "text",
        "index": true,
        "analyzer": "ik_smart"
      },
      "age":{
        "type": "byte",
        "index": true
      },
      "name":{
        "type": "keyword",
        "index": true
      }
    }
  }
}
```

执行结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

1.2.2 查询索引库

基本语法:

1)请求方式:GET

2)请求路径:/索引库名

3)请求参数:无

格式如下:

```javascript
GET /索引库名
```

举个例子:

```javascript
GET /xbs
```

执行结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

1.2.3 修改索引库

倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建

倒排索引,这简直是灾难。因此索引库一旦创建,无法修改 mapping。

虽然无法修改 mapping 中已有的字段,但是却允许添加新的字段到 mapping 中,因为不会

对倒排索引产生影响。因此修改索引库能做的就是向索引库中添加新字段,或者更新索引库的基础

属性。

格式如下:

```javascript
PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}
```

举个例子:

```javascript
PUT /xbs/_mapping
{
  "properties": {
    "parent": {
      "type": "object",
      "properties": {
        "father": {
          "type": "keyword",
          "index": false
        },
        "mother": {
          "type": "keyword",
          "index": false
        }
      }
    }
  }
}
```

执行结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

再来查询整体结构:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

1.2.4 删除索引库

基本语法:

1)请求方式:DELETE

2)请求路径:/索引库名

3)请求参数:无

格式如下:

```javascript
DELETE /索引库名
```

举个例子:

```javascript
DELETE /xbs
```

输出结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

2.0 文档操作

有了索引库,接下来就可以向索引库中添加数据了。

Elasticsearch 中的数据其实就是 JSON 风格的文档。操作文档自然保护增、删、改、查等

几种常见操作。

2.1 新增文档

语法:

```javascript
POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
}
```

举个例子:

```javascript
# 新增数据
POST /xbs/_doc/1
{
  "id": 1,
  "age": 22,
  "msg": "我是小扳手",
  "name": "xbs",
  "parent": {
    "father": "螺丝刀",
    "mother": "锤子"
  }
}
```

2.2 查询文档

根据 rest 风格,新增是 post,查询应该是 get,不过查询一般都需要条件,这里我们把文档

id 带上。

语法:

```javascript
GET /{索引库名称}/_doc/{id}
```

举个例子:

```javascript
# 查看数据
GET /xbs/_doc/1
```

输出结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

2.3 删除文档

删除使用 DELETE 请求,同样,需要根据 id 进行删除。

语法:

```javascript
DELETE /{索引库名}/_doc/id值
```

举个例子:

```javascript
# 删除数据
DELETE /xbs/_doc/1
```

输出结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

2.4 修改文档

修改有两种方式:

1)全量修改:直接覆盖原来的文档。

2)局部修改:修改文档中的部分字段。

2.4.1 全量修改

语法:

```javascript
PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}
```

举个例子:

```javascript
#全量修改数据
PUT /xbs/_doc/1
{
  "id": 1,
  "age": 18
}
```

输出结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

2.4.2 局部修改

局部修改是只修改指定 id 匹配的文档中的部分字段。

语法:

```javascript
POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}
```

举个例子:

```javascript

#局部修改数据
POST /xbs/_update/1
{
  "doc": {
    "id": 1,
    "age": 18
  }
}

```

查看数据:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

可以看到,只有 age 字段的信息修改了,其他字段的信息没有被修改。

2.5 批处理

批处理采用 POST 请求,基本语法如下:

```javascript
POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }
```

其中:

1)index代表新增操作

_index:指定索引库名

_id指定要操作的文档id

{ "field1" : "value1" }:则是要新增的文档内容

2)delete代表删除操作

_index:指定索引库名

_id指定要操作的文档id

3)update代表更新操作

_index:指定索引库名

_id指定要操作的文档id

{ "doc" : {"field2" : "value2"} }:要更新的文档字段

举个例子:

```javascript
#批量新增数据
PUT _bulk
{"index":{"_index": "xbs","_id": 2}}
{"id": 2,"age": 19,"name": "唐唐"}
{"index": {"_index" : "xbs", "_id": 3}}
{"id": 3,"age": 20,"name": "童童"}
```

查看数据:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

3.0 RestAPI

ES 官方提供了各种不同语言的客户端,用来操作 ES。这些客户端的本质就是组装 DSL 语

句,通过 http 请求发送给 ES 。

官方文档地址:Elasticsearch Clients | Elastic

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

3.1 初始化 RestClient

在 elasticsearch 提供的 API 中,与 elasticsearch 一切交互都封装在一个名为

RestHighLevelClient 的类中,必须先完成这个对象的初始化,建立与 elasticsearch 的连接。

1)在模块中引入 es 的 RestHighLevelClient 依赖:

```XML

    org.elasticsearch.client
    elasticsearch-rest-high-level-client

```

注意版本为:7.12.1

2)因为 SpringBoot 默认的 ES 版本是 7.17.10,所以需要覆盖默认的 ES 版本:

```XML
  
      11
      11
      7.12.1
  
```

3)初始化 RestHighLevelClient:

代码如下:

```java
public class ItemApplicationText {
    private RestHighLevelClient client;


    @BeforeEach
    //先初始化,连接到es服务端
    public void init() {
        this.client = new RestHighLevelClient(
                RestClient.builder(HttpHost.create("http://113.45.xxx.xxx:9200")));
    }
    @Test
    public void test() throws Exception {
        if (client != null){
            System.out.println("连接成功:" + client);
        }else {
            System.out.println("连接失败");
        }

    }

    @AfterEach
    //程序结束后,关闭连接
    public void close() throws Exception {
        this.client.close();
    }
}
```

执行结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

3.2 创建索引库

创建索引库的 API 如下:

```java
    @Test
    public void build() throws Exception {
        //1.创建Request对象
        CreateIndexRequest request = new CreateIndexRequest("xbs");
        //2.准备请求参数,就是创建索引的请求参数JSON字符串
        request.source(MAPPING_TEMPLATE, XContentType.JSON);
        //3.发送请求
        client.indices().create(request, RequestOptions.DEFAULT);
        //该方法返回的对象中包含索引库操作的所有方法
    }
```

MAPPING_TEMPLATE 字符串常量:

创建索引库中的语句:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

代码分为三步:

1)创建 Request 对象。

因为是创建索引库的操作,因此 Request 是 CreateIndexRequest 。

2)添加请求参数

其实就是 Json 格式的 Mapping 映射参数。因为 json 字符串很长,这里是定义了静态字符

串常量 MAPPING_TEMPLATE,让代码看起来更加优雅。

3)发送请求

client.indices() 方法的返回值是 IndicesClient 类型,封装了所有与索引库操作有关的方

法。例如创建索引、删除索引、判断索引是否存在等。

3.3 删除索引库

删除索引库的请求非常简单。

注意体现在 Request 对象上。流程如下:

1)创建 Request 对象。这次是 DeleteIndexRequest 对象。

2)准备参数。这里是无参,因此省略。

3)发送请求。改用 delete 方法。

具体代码如下:

```java
    @Test
    //删除索引库
    public void deleteIndex() throws IOException {
        //1.创建Request对象
        DeleteIndexRequest request = new DeleteIndexRequest("xbs");
        //2.发送请求
        client.indices().delete(request, RequestOptions.DEFAULT);
    }
```

3.4 判断索引库是否存在

判断索引库是否存在,本质就是查询,对应的请求语句是:

```javascript
GET /xbs
```

具体代码如下:

```java
    @Test
    //查询索引库
    public void getIndex() throws IOException {
        //1.创建Request对象
        GetIndexRequest request = new GetIndexRequest("xbs");
        //2.发送请求
        boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
        if (exists ){
            System.out.println("索引库存在");
        }else {
            System.out.println("索引库不存在");
        }
    }
```

执行结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

4.0 RestClient 操作文档

索引库准备好以后,就可以操作文档了。

4.1 新增文档

新增文档的请求语法如下:

```javascript
# 新增数据
POST /xbs/_doc/1
{
  "id": 1,
  "age": 22,
  "msg": "我是小扳手",
  "name": "xbs",
  "parent": {
    "father": "螺丝刀",
    "mother": "锤子"
  }
}
```

对应的 JavaAPI 如下:

```java
    @Test
    //新增数据
    public void addData() throws IOException {
        User user = new User(1, "我是小扳手", 18, "xbs", new Parent("father", "mother"));

        //1.创建Request对象
        IndexRequest request = new IndexRequest("xbs").id("1");
        //2.准备JSON文档
        request.source(JSONUtil.toJsonStr(user), XContentType.JSON);
        //3.发送请求
        client.index(request, RequestOptions.DEFAULT);
    }
```

查看结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

可以看到与索引库操作的 API 非常类似,同样是三步走:

1)创建 Request 对象,这里是 IndexRequest,因为添加文档就是创建倒排索引的过程。

2)准备请求参数,本例中就是 Json 文档。

3)发送请求。

变化的地方在于,这里直接使用 client.xxx() 的 API,不再需要 client.indices() 了。

4.2 查询文档

查询的请求语句如下:

```javascript
GET /{索引库名}/_doc/{id}
```

对应的 JavaAPI 如下:

```java
    @Test
    //查询数据
    public void getData() throws IOException {

        //1.创建Request对象
        GetRequest getRequest = new GetRequest("xbs","1");
        //2.发送请求
        GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
        String sourceAsString = documentFields.getSourceAsString();
        //查看结果
        //将其转化为user对象
        User bean = JSONUtil.toBean(sourceAsString, User.class);
        System.out.println(bean);
    }
```

执行结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

4.3 删除文档

删除的请求语句如下:

```javascript
DELETE /hotel/_doc/{id}
```

对应的 JavaAPI 如下:

```java
    @Test
    //删除数据
    public void deleteData() throws IOException {
        //1.创建Request对象
        DeleteRequest request = new DeleteRequest("xbs","1");
        //2.发送请求
        client.delete(request, RequestOptions.DEFAULT);
    }
```

4.4 修改文档

修改有两种方式:

1)全量修改:本质是先根据 id 删除,再新增。

2)局部修改:修改文档中的指定字段值。

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

1)如果新增时,ID 已经存在,则修改。

2)如果新增时,ID 不存在,则新增。

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

具体代码如下:

```java
    @Test
    //修改数据
    public void updateData() throws IOException {
        //1.创建Request对象
        UpdateRequest request = new UpdateRequest("xbs","1");
        //2.添加参数,每两个参数为一对,组成 key-value
        request.doc("name","唐唐");
        //3.发送请求
        client.update(request, RequestOptions.DEFAULT);
    }
```

执行结果:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

与之前类似,也是三步走:

1)准备 Request 对象。这次是修改,所以是 UpdateRequest 。

2)准备参数,也就是 JSON 文档,里面包含要修改的字段。

3)更新文档,这里调用 client.update() 方法。

4.5 批量导入文档

批处理与前面讲的文档的 CRUD 步骤基本一致:

1)创建 Request,但这次用的是 BulkRequest

2)准备请求参数

3)发送请求,这次要用到 client.bulk() 方法

BulkRequest 本身其实并没有请求参数,其本质就是将多个普通的 CRUD 请求组合在一起发

送。例如:

1)批量新增文档,就是给每个文档创建一个 IndexRequest 请求,然后封装到

BulkRequest 中,一起发出。

2)批量删除,就是创建 N 个 DeleteRequest 请求,然后封装到 BulkRequest,一起发出。

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

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

具体代码如下:

批量新增:

```java
    @Test
    //批量新增
    public void bulk() throws IOException {
        //插入的数据
        User user = new User(2, "有很多天才", 18, "天才1号", new Parent("老爹", "母亲"));
        User user2 = new User(3, "都喊我是天才", 22, "天才2号", new Parent("老豆", "老妈"));

        //1.创建Request对象
        BulkRequest bulkRequest = new BulkRequest();
        //2.准备参数
        bulkRequest.add(new IndexRequest("xbs").id("2").source(JSONUtil.toJsonStr(user), XContentType.JSON));
        bulkRequest.add(new IndexRequest("xbs").id("3").source(JSONUtil.toJsonStr(user2), XContentType.JSON));
        //3.发送请求
        client.bulk(bulkRequest, RequestOptions.DEFAULT);
    }
```

执行结果:

id 为 "2":

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

id 为 "3":

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

批量删除:

具体代码如下:

```java
    @Test
    //批量删除
    public void bulkDelete() throws IOException {
        //1.创建Request
        BulkRequest bulkRequest = new BulkRequest();
        //2.准备参数
        bulkRequest.add(new DeleteRequest("xbs", "2"));
        bulkRequest.add(new DeleteRequest("xbs", "3"));
        //3.发送请求
        client.bulk(bulkRequest, RequestOptions.DEFAULT);
    }
```

执行结果:

查询 id 为 2:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

查询 id 为 3:

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/6717.html

(0)
LomuLomu
上一篇 2025 年 1 月 17 日 下午10:03
下一篇 2025 年 1 月 17 日 下午10:33

相关推荐

  • 扣子又出新功能,支持一键部署小程序,太强了!!

    大家好,我是R哥。 作为一名程序员和技术博主,我一直关注如何使用工具提升生产力,尤其是在内容创作和应用开发领域。 拿我开发一个微信小程序为例,我需要懂前端、后端、运维 等全栈技术,开发流程和技术栈复杂,我还需要购买云服务器、云数据库 等各种基础设施,资源耗费非常多。 虽然现在有如 Cursor 这样的革命性 AI 开发工具,它突破了传统开发模式的壁垒,非开发…

    2025 年 1 月 10 日
    16500
  • 深入解析 Spring AI 系列:以OpenAI与Moonshot案例为例寻找共同点

    今天,我们将重点探讨对接的业务逻辑。为了帮助大家更直观地掌握其中的规律性,我将通过对比OpenAI与《月之暗面》中的Moonshot两个案例来阐述这一点。通过这样的对比,大家可以更清晰地看到,这些对接业务的整体框架其实非常相似。换句话说,我们要做的工作只是其中的一小部分,但它同样是关键的一环。 好了,接下来我们就开始深入了解这个话题。 模型对接 我们首先需要…

    2025 年 1 月 13 日
    14600
  • Django 3 Web应用开发实战PDF、EPUB免费下载

    适读人群 :适合有一定Python基础的Web开发人员阅读,也可用作培训机构和大中专院校相关专业的教学参考书。 以DjangoWeb项目开发为主线,从源码的角度,深入剖析Django3企业级开发技术。 电子版仅供预览,下载后24小时内务必删除,支持正版,喜欢的请购买正版书籍 点击原文去下载 书籍信息 作者: 黄永祥出版社: 清华大学出版社出版年: 2021-…

    2025 年 1 月 12 日
    12800
  • manim边学边做–改变动画速度

    ChangeSpeed类是Manim库中用于修改动画速度的类。 它提供了一种灵活的方式来控制动画的播放速度,使动画在不同时间段内以不同的速度播放,从而创造出更加丰富多样的动画效果。 比如,在创建包含多个元素动画的场景中,通过ChangeSpeed可以精确控制不同元素在不同时间点的移动速度,实现复杂的动画节奏编排。 1. 动画概述 与之前介绍的那些动画类不同,…

    2024 年 12 月 31 日
    12200
  • MySQL 优化利器 SHOW PROFILE 的实现原理

    背景 近期,我遇到了一个技术挑战:通过传输表空间的方式导入一个体积达4GB的表,整个过程耗时13分钟。通过PROFILE工具的分析,我惊讶地发现,大部分时间竟然花费在了System lock阶段。 mysql> set profiling=1; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> al…

    未分类 2024 年 12 月 24 日
    19300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信