微服务—DSL基础语法与RestClient操作

这篇具有很好参考价值的文章主要介绍了微服务—DSL基础语法与RestClient操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本博客为个人学习笔记,学习网站:黑马程序员SpringCloud 2021教程

目录

DSL语法

索引库操作

mapping属性

创建索引库

 字段拷贝 

查询、删除、修改索引库

文档操作

新增文档

查询、删除文档

修改文档

全量修改

增量修改

DSL文档语法小结

RestClient操作

初始化RestClient

索引库操作

RestClient创建索引库

RestClient删除索引库

RestClient判断索引库是否存在

文档操作

RestClient新增文档

RestClient查询文档

RestClient修改文档

全量修改

增量修改

RestClient删除文档

RestClient批量新增文档

RestClient文档操作小结


DSL语法

索引库操作

mapping属性

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

1. type:字段数据类型,常见的简单类型有:
        字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址、分词无意义的值)
        数值:long、integer、short、byte、double、float
        布尔:boolean
        日期:date
        对象:object

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

3. analyzer:使用哪种分词器

4. properties:该字段的子字段


创建索引库

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据

示例 :
按以下json文档的字段创建一个索引库

{
    "age": 21,
    "weight": 52.1,
    "isMarried": false,
    "info": "黑马程序员Java讲师",
    "email": "zy@itcast.cn",
    "score": [99.1, 99.5, 98.9],
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

创建索引库DSL语句如下

# 创建索引库
PUT /heima
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "type": "object",
        "properties": {
          "firstName":{
            "type": "keyword"
          },
          "lastName":{
            "type":"keyword"
          }
        }
      }
    }
  }
}

 字段拷贝 

如果在查询文档时,想要同时基于多个字段进行查询,那么在创建索引库时,可以把这些字段通过"copy_to"拷贝到另外一个字段all中,在之后的搜索中,直接搜索all字段即可。而且,all字段在查询得到的结果文档中是不会显示出来的,但是在查询的时候,会提示可以查询all字段。

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据


查询、删除、修改索引库

查询索引库:

#语法
GET /索引库名

#示例如下
GET /heima

 删除索引库:

#语法如下
DELETE /索引库名

#示例如下
DELETE /heima

修改索引库:
        倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引,这简直是灾难。因此索引库一旦创建,就无法修改mapping。虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为这样不会对倒排索引产生影响。

新增字段:

#语法如下
PUT /索引库名/_mapping
{
  "properties": {
    "新字段名":{
      "type": "integer"
    }
  }
}

#示例如下(新字段名必须和存在的字段名不同)
PUT /heima/_mapping
{
  "properties":{
    "age":{
      "type":"long"
    }
  }
}

文档操作

新增文档

#语法如下
POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
    // ...
}

#示例如下
POST /heima/_doc/1
{
    "info": "黑马程序员Java讲师",
    "email": "zy@itcast.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

查询、删除文档

查询文档:

#语法如下
GET /{索引库名称}/_doc/{id}

#示例如下
GET /heima/_doc/1

删除文档:

#语法如下
DELETE /{索引库名}/_doc/id值

#示例如下(根据id删除文档)
DELETE /heima/_doc/1

修改文档

修改文档有两种方式:
1. 全量修改:直接覆盖原来的文档
2. 增量修改:修改文档中的部分字段 

全量修改

全量修改是覆盖原来的文档,其本质是:先根据指定的id删除文档,再新增一个相同id的文档
注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

#语法如下
PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}

#示例如下
PUT /heima/_doc/1
{
    "info": "黑马程序员高级Java讲师",
    "email": "zy@itcast.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

增量修改

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

#语法如下
POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

#示例如下
POST /heima/_update/1
{
  "doc": {
    "email": "ZhaoYun@itcast.cn"
  }
}

DSL文档语法小结

创建文档:POST/(索引库名}/_doc/文档id {json文档}
查询文档:GET /(索引库名}/_doc/文档id
删除文档:DELETE /(索引库名}/_doc/文档id
修改文档:
        全量修改:PUT /(索引库名}/doc/文档id {json文档 }
        增量修改:POST/{索引库名}/_update/文档id {“doc":{字段}}


RestClient操作

初始化RestClient

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

步骤1. 引入es的RestHighLevelClient依赖:

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

步骤2. 因为SpringBoot默认的ES版本是7.6.2,所以我们需要覆盖默认的ES版本:

<properties>
    <java.version>1.8</java.version>
    <elasticsearch.version>7.12.1</elasticsearch.version>
</properties>

步骤3. 初始化RestHighLevelClient,代码如下:

RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
        HttpHost.create("http://192.168.150.101:9200")
));

步骤4. 这里为了单元测试方便,我们创建一个测试类HotelIndexTest,然后将初始化的代码编写在@BeforeEach方法中:

package cn.itcast.hotel;

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestHighLevelClient;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import java.io.IOException;

public class HotelIndexTest {
    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.150.101:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }
}

索引库操作

RestClient创建索引库

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据

代码如下: 

@Test
void createHotelIndex() throws IOException {
    // 1.创建Request对象
    CreateIndexRequest request = new CreateIndexRequest("hotel");
    // 2.准备请求的参数:DSL语句
    request.source(MAPPING_TEMPLATE, XContentType.JSON);
    // 3.发送请求
    client.indices().create(request, RequestOptions.DEFAULT);
}

RestClient删除索引库

@Test
void testDeleteHotelIndex() throws IOException {
    // 1.创建Request对象
    DeleteIndexRequest request = new DeleteIndexRequest("hotel");
    // 2.发送请求
    client.indices().delete(request, RequestOptions.DEFAULT);
}

RestClient判断索引库是否存在

@Test
void testExistsHotelIndex() throws IOException {
    // 1.创建Request对象
    GetIndexRequest request = new GetIndexRequest("hotel");
    // 2.发送请求
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    // 3.输出
    System.err.println(exists ? "索引库已经存在!" : "索引库不存在!");
}

文档操作

RestClient新增文档

我们需要将数据库的酒店数据查询出来,写入elasticsearch中。而数据库查询后得到的结果是一个Hotel类型的对象。结构如下:

@Data
@TableName("tb_hotel")
public class Hotel {
    @TableId(type = IdType.INPUT)
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String longitude;
    private String latitude;
    private String pic;
}

由于该对象的结构与elasticsearch索引库结构存在差异,因此我们需要定义一个新的类型,与索引库结构吻合,结构如下:

package cn.itcast.hotel.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class HotelDoc {
    private Long id;
    private String name;
    private String address;
    private Integer price;
    private Integer score;
    private String brand;
    private String city;
    private String starName;
    private String business;
    private String location;
    private String pic;

    public HotelDoc(Hotel hotel) {
        this.id = hotel.getId();
        this.name = hotel.getName();
        this.address = hotel.getAddress();
        this.price = hotel.getPrice();
        this.score = hotel.getScore();
        this.brand = hotel.getBrand();
        this.city = hotel.getCity();
        this.starName = hotel.getStarName();
        this.business = hotel.getBusiness();
        this.location = hotel.getLatitude() + ", " + hotel.getLongitude();
        this.pic = hotel.getPic();
    }
}

新增文档语法: 

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据

从数据库中查询数据,并新增到ES文档实现:

@Test
void testAddDocument() throws IOException {
    // 1.根据id查询酒店数据
    Hotel hotel = hotelService.getById(61083L);
    // 2.转换为文档类型
    HotelDoc hotelDoc = new HotelDoc(hotel);
    // 3.将HotelDoc转json
    String json = JSON.toJSONString(hotelDoc);

    // 1.准备Request对象
    IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
    // 2.准备Json文档
    request.source(json, XContentType.JSON);
    // 3.发送请求
    client.index(request, RequestOptions.DEFAULT);
}

RestClient查询文档

查询语法:

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据

代码如下: 

@Test
void testGetDocumentById() throws IOException {
    // 1.准备Request
    GetRequest request = new GetRequest("hotel", "61082");
    // 2.发送请求,得到响应
    GetResponse response = client.get(request, RequestOptions.DEFAULT);
    // 3.解析响应结果
    String json = response.getSourceAsString();

    HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);
    System.out.println(hotelDoc);
}

RestClient修改文档

在DSL语法中,我们讲过修改文档的两种方式:
1. 全量修改:本质是先根据id删除,再新增
2. 增量修改:修改文档中的指定字段值

全量修改

在Restclient的API中,全量修改与新增的API完全一致,判断依据是ID:
如果新增时,ID已存在,则修改;
如果新增时,ID不存在,则新增。
全量修改的语法这里不再赘述,参考前面的新增文档即可,这里我们主要关注增量修改。


增量修改

增量修改语法如下:

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据

代码如下:

@Test
void testUpdateDocument() throws IOException {
    // 1.准备Request
    UpdateRequest request = new UpdateRequest("hotel", "61083");
    // 2.准备请求参数
    request.doc(
        "price", "952",
        "starName", "四钻"
    );
    // 3.发送请求
    client.update(request, RequestOptions.DEFAULT);
}

RestClient删除文档

根据id删除文档,代码如下:

@Test
void testDeleteDocument() throws IOException {
    // 1.准备Request
    DeleteRequest request = new DeleteRequest("hotel", "61083");
    // 2.发送请求
    client.delete(request, RequestOptions.DEFAULT);
}

RestClient批量新增文档

利用BulkRequest实现批量操作,其本质就是将多个普通的CRUD请求组合在一起发送。

其中提供了一个add方法,我们可以把IndexRequest(新增)、UpdateRequest(修改)、DeleteRequest(删除) 通过add方法进行添加,从而实现批量操作。

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据

示例: 

微服务—DSL基础语法与RestClient操作,微服务,学习笔记,ES,elasticsearch,java,大数据

利用MP从数据库获取数据,并批量新增完整代码: 

@Test
void testBulkRequest() throws IOException {
    // 批量查询酒店数据
    List<Hotel> hotels = hotelService.list();

    // 1.创建Request
    BulkRequest request = new BulkRequest();
    // 2.准备参数,添加多个新增的Request
    for (Hotel hotel : hotels) {
        // 2.1.转换为文档类型HotelDoc
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 2.2.创建新增文档的Request对象
        request.add(new IndexRequest("hotel")
                    .id(hotelDoc.getId().toString())
                    .source(JSON.toJSONString(hotelDoc), XContentType.JSON));
    }
    // 3.发送请求
    client.bulk(request, RequestOptions.DEFAULT);
}

RestClient文档操作小结

文档操作的基本步骤:
1. 初始化RestHighLevelClient
2. 创建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
3. 准备参数(Index、Update、Bulk时需要)
4. 发送请求。调用RestHighLevelClient#.xxx()方法,xx是index、get、update、delete、bulk
5. 解析结果(Get时需要)文章来源地址https://www.toymoban.com/news/detail-826935.html

到了这里,关于微服务—DSL基础语法与RestClient操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微服务学习|初识elasticsearch、操作索引库、文档操作、RestClient操作索引库、RestClient操作文档

    elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack (ELK)。被广泛应用在日志数据分析、实时监控等领域 elasticsearch是elastic stack的核心,负责存储、搜索、分析数据 Lucene是一个jav

    2024年01月18日
    浏览(37)
  • 【黑马SpringCloud(5)】ES高阶语法及RestClient实现

    消费端代码:https://gitee.com/suisui9857/hotel-demo 发送端代码:https://gitee.com/suisui9857/hotel-admin 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何

    2023年04月09日
    浏览(29)
  • 【ES系列】ES的数据结构与DSL语法

    本篇章将围绕ES的基本功能、实现原理与性能优化这三个方面,使读者能够逐渐深入了解ES的特点与能力。本篇所用的版本为7.10.2同kibana版本,需要注意的是,es与kibana至少在大版本上要保持一致,否则功能上会有兼容性问题。 ES的特征 分布式:ES是分布式的开源搜索和分析引

    2024年02月07日
    浏览(25)
  • 17、全文检索 -- Elasticsearch -- 使用 反应式 RestClient (ReactiveElasticsearchClient)操作 Es 服务器(增、删、查 :索引库和文档)

    Elasticsearch 所提供 RestHighLevelClient 本身提供了 【同步编程】 和 【异步编程】两种模型。 Elasticsearch 官方并未提供反应式的 RestClient : 因此 Spring Data Elasticsearch 额外补充了一个 ReactiveElasticsearchClient,用于提供反应式API支持, ReactiveElasticsearchClient 相当于 RestHighLevelClient 的反应式

    2024年04月28日
    浏览(36)
  • ES高级查询语法DSL实战 - 第504篇

    历史文章( 文章 累计500+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《国内最全的Spring Boot系列之七》 E

    2024年04月27日
    浏览(37)
  • 【ES专题】ElasticSearch 高级查询语法Query DSL实战

    个人在学习的过程中,感觉比较吃力的地方有如下: 语法结构比较陌生 没有中文文档, 只能看英文 其他博客也比较少介绍语法结构。比如说,为什么查询中会出现 query 有ES入门基础,且想进一步学习ES基本操作的朋友 系列上一篇文章:《【ES专题】ElasticSearch快速入

    2024年02月06日
    浏览(35)
  • Elasticsearch常用查询语法及RestClient操作

    match查询 :全文检索查询的一种,会对用户内容分词,然后去倒排索引库检索,语法。 multi_match :和match类似,但是它允许多个字段进行查询 解释:在 hotel索引库 中按照 address 和 name 两个字段搜索值 包含北京 的文档 精准查询一般是查找keyword,数值,日期,boolean等 不可分

    2024年04月25日
    浏览(42)
  • ES的安装和RestClient的操作

    目录 初识elasticsearch 什么是elasticsearch elasticsearch的发展 Lucene的优缺点 elasticsearch的优势 倒排索引  es与mysql的概念对比 文档 索引 概念对比 架构 安装es 安装kibana 安装ik分词器  分词器 安装ik分词器 ik分词器的拓展和停用词典 操作索引库 mapping属性 创建索引库 查询、删除、修

    2024年02月03日
    浏览(36)
  • elasticsearch 笔记二:搜索DSL 语法(搜索API、Query DSL)

    从索引 tweet 里面搜索字段 user 为 kimchy 的记录 从索引 tweet,user 里面搜索字段 user 为 kimchy 的记录 从所有索引里面搜索字段 tag 为 wow 的记录 说明:搜索的端点地址可以是多索引多 mapping type 的。搜索的参数可作为 URI 请求参数给出,也可用 request body 给出 URI 搜索方式通过 URI

    2024年02月04日
    浏览(39)
  • 微服务——es数据聚合+RestClient实现聚合

     如图所示,设置了10个桶,那么就显示了数量最多的前10个桶,品牌含有7天酒店的有30家, 品牌含有如家的也有30家。 修改排序规则    限定聚合范围 如下案例要求对不同的品牌进行统计,所以要进行分组。  如图所示,要对桶的平均评分做排序,要使用不同桶的平均评分

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包