草庐IT

04-HighLevelAPI入门

OnlyOnYourself-lzw 2023-04-16 原文

八、HighLevelAPI

8.1、RestAPI介绍&项目导入

8.1.1、RestAPI介绍

  • ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES
  • 官方文档地址
  • 其中的Java Rest Client又包括两种
    • Java Low Level Rest Client
    • Java High Level Rest Client

本次学习的是HighLevel版本

8.1.2、项目导入

有需要的可以直接联系本人

①、数据库数据导入

  • 导入自定义的数据即可;

②、创建初始工程

  • 初始工程创建成功后,目录结构如下所示

    • 其中HotelDoc后续会说到
  • 配置application.yml

    • 在spring层级下添加es的服务端路径配置

    •   elasticsearch:
          rest:
            uris:
              - http://192.168.222.135:9200
      
  • 导入相关依赖

    • <?xml version="1.0" encoding="UTF-8"?>
      <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
          <modelVersion>4.0.0</modelVersion>
          <parent>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-parent</artifactId>
              <version>2.3.8.RELEASE</version>
              <relativePath/> <!-- lookup parent from repository -->
          </parent>
          <groupId>com.coolman.hotel</groupId>
          <artifactId>hotel-demo</artifactId>
          <name>hotel-demo</name>
          <description>Demo project for Spring Boot</description>
          <properties>
              <java.version>1.8</java.version>
          </properties>
          <dependencies>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-web</artifactId>
              </dependency>
              <dependency>
                  <groupId>com.baomidou</groupId>
                  <artifactId>mybatis-plus-boot-starter</artifactId>
                  <version>3.1.1</version>
              </dependency>
              <dependency>
                  <groupId>mysql</groupId>
                  <artifactId>mysql-connector-java</artifactId>
                  <version>8.0.27</version>
                  <scope>runtime</scope>
              </dependency>
              <dependency>
                  <groupId>org.projectlombok</groupId>
                  <artifactId>lombok</artifactId>
                  <optional>true</optional>
              </dependency>
              <dependency>
                  <groupId>org.springframework.boot</groupId>
                  <artifactId>spring-boot-starter-test</artifactId>
                  <scope>test</scope>
              </dependency>
      		<dependency>
                  <groupId>org.apache.commons</groupId>
                  <artifactId>commons-lang3</artifactId>
              </dependency>
      
              <!--es的RestAPI依赖-->
              <dependency>
                  <groupId>org.elasticsearch.client</groupId>
                  <artifactId>elasticsearch-rest-high-level-client</artifactId>
              </dependency>
          </dependencies>
      
          <build>
              <plugins>
                  <plugin>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-maven-plugin</artifactId>
                      <configuration>
                          <excludes>
                              <exclude>
                                  <groupId>org.projectlombok</groupId>
                                  <artifactId>lombok</artifactId>
                              </exclude>
                          </excludes>
                      </configuration>
                  </plugin>
              </plugins>
          </build>
      
      </project>
      
      
  • 编写测试类,验证是否可以正常连接

    • package com.coolman.hotel.test;
      
      import lombok.extern.slf4j.Slf4j;
      import org.elasticsearch.client.RestHighLevelClient;
      import org.junit.jupiter.api.Test;
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      
      @SpringBootTest
      @Slf4j
      public class TestConnectES {
      
          @Autowired
          private RestHighLevelClient restHighLevelClient;
      
          @Test
          public void testConnect() {
            log.info(restHighLevelClient + "");
          }
      }
      
      

8.2、创建索引

  • 代码如下所示

    •     /**
           * 创建索引测试
           */
          @Test
          public void testCreateIndex() throws IOException {
              // 1. 获取索引操作对象
              IndicesClient indicesClient = restHighLevelClient.indices();
      
              // 2. 创建索引对象
              CreateIndexRequest request = new CreateIndexRequest("hotel");// 相当于DSL语句的 PUT hotel 请求,但是还没执行
      
              // 3. 执行操作
              CreateIndexResponse response = indicesClient.create(request, RequestOptions.DEFAULT);
      
              // 4. 获取结果
              log.info(response.isAcknowledged() + "");
      
          }
      
  • 运行结果如下所示

  • Kibana验证

8.3、添加映射

  • 代码如下所示

    • 因为创建映射需要DSL语句,所以先在kibana编写如下语句

      • DELETE hotel
        
        GET hotel/_mapping
        
        # 分析hotel索引库的映射结构
        # index属性:是否建立索引,默认值true,如果该字段不用查询,则设置false
        # copy_to: 把指定字段的值拷贝到另一个字段上
        PUT hotel
        {
          "mappings": {
            "properties": {
              "id": {
                "type": "keyword"
              },
              "name": {
                "type": "text",
                "analyzer": "ik_smart",
                "copy_to": "all"
              },
              "address": {
                "type": "text",
                "analyzer": "ik_smart"
              },
              "price": {
                "type": "integer"
              },
              "score": {
                "type": "integer"
              },
              "brand": {
                "type": "keyword",
                "copy_to": "all"
              },
              "city": {
                "type": "keyword"
              },
              "starName": {
                "type": "keyword"
              },
              "business": {
                "type": "keyword",
                "copy_to": "all"
              },
              "location": {
                "type": "geo_point"
              },
              "pic": {
                "type": "keyword",
                "index": false
              },
              "isAD": {
                "type": "boolean"
              },
              "all": {
                "type": "text",
                "analyzer": "ik_smart"
              }
            }
          }
        }
        
    • 创建成功后,再删除,将mappings中的字段复制到Java代码中

    •     /**
           * 添加映射测试
           */
          @Test
          public void testAddMapping() throws IOException {
              // 1. 创建索引操作对象
              IndicesClient indicesClient = restHighLevelClient.indices();
      
              // 2. 创建索引
              CreateIndexRequest request = new CreateIndexRequest("hotel");
      
              // 3. 定义mapping语句
              String mapping = "{\n" +
                      "    \"properties\": {\n" +
                      "      \"id\": {\n" +
                      "        \"type\": \"keyword\"\n" +
                      "      },\n" +
                      "      \"name\": {\n" +
                      "        \"type\": \"text\",\n" +
                      "        \"analyzer\": \"ik_smart\",\n" +
                      "        \"copy_to\": \"all\"\n" +
                      "      },\n" +
                      "      \"address\": {\n" +
                      "        \"type\": \"text\",\n" +
                      "        \"analyzer\": \"ik_smart\"\n" +
                      "      },\n" +
                      "      \"price\": {\n" +
                      "        \"type\": \"integer\"\n" +
                      "      },\n" +
                      "      \"score\": {\n" +
                      "        \"type\": \"integer\"\n" +
                      "      },\n" +
                      "      \"brand\": {\n" +
                      "        \"type\": \"keyword\",\n" +
                      "        \"copy_to\": \"all\"\n" +
                      "      },\n" +
                      "      \"city\": {\n" +
                      "        \"type\": \"keyword\"\n" +
                      "      },\n" +
                      "      \"starName\": {\n" +
                      "        \"type\": \"keyword\"\n" +
                      "      },\n" +
                      "      \"business\": {\n" +
                      "        \"type\": \"keyword\",\n" +
                      "        \"copy_to\": \"all\"\n" +
                      "      },\n" +
                      "      \"location\": {\n" +
                      "        \"type\": \"geo_point\"\n" +
                      "      },\n" +
                      "      \"pic\": {\n" +
                      "        \"type\": \"keyword\",\n" +
                      "        \"index\": false\n" +
                      "      },\n" +
                      "      \"isAD\": {\n" +
                      "        \"type\": \"boolean\"\n" +
                      "      },\n" +
                      "      \"all\": {\n" +
                      "        \"type\": \"text\",\n" +
                      "        \"analyzer\": \"ik_smart\"\n" +
                      "      }\n" +
                      "    }\n" +
                      "  }";
      
              request.mapping(mapping, XContentType.JSON);    // 设置mappings字段,并指定其内容为json格式
      
              // 4. 执行操作
              CreateIndexResponse response = indicesClient.create(request, RequestOptions.DEFAULT);
      
              // 5. 获取结果
              log.info(response.isAcknowledged() + "");
      
          }
      
  • 运行结果如下所示

  • Kibana验证

8.4、删除索引

  • 代码如下所示

    •     /**
           * 删除索引测试
           */
          @Test
          public void testDeleteIndex() throws IOException {
              // 1. 获取索引操作对象
              IndicesClient indicesClient = restHighLevelClient.indices();
              
              // 2. 获取索引对象
              DeleteIndexRequest request = new DeleteIndexRequest("hotel");   // DELETE hotel
      
              // 3. 执行操作
              AcknowledgedResponse response = indicesClient.delete(request, RequestOptions.DEFAULT);
      
              // 4. 获取结果
              log.info("" + response.isAcknowledged());
          }
      
  • 比较简单,自行验证即可

8.5、添加文档

  • 代码如下所示

    •     /**
           * 添加文档测试
           */
      // Jackson
          private ObjectMapper objectMapper = new ObjectMapper();
          @Test
          public void testAddDocument() throws IOException {
              // 先获取 指定的 hotel数据
              Hotel hotel = hotelMapper.selectById(36934);
              HotelDoc hotelDoc = new HotelDoc(hotel);
      
              // 1. 创建请求对象
              IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
      
              // 2. 填充文档内容
              String json = objectMapper.writeValueAsString(hotelDoc);
              request.source(json, XContentType.JSON);
      
              // 3. 执行请求体对象
              IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
      
              // 4. 获取结果
              log.info(response.getId() + "");
          }
      
  • Kibana验证

8.6、修改、查询、删除文档

8.6.1、修改文档

修改文档和添加文档操作一样,需要注意的是修改文档必须是已经存在的ID

  • 代码如下所示

    •     /**
           * 修改文档
           */
          @Test
          public void testUpdateDocument() throws IOException {
              // 1. 先获取 指定的 hotel 数据
              Hotel hotel = hotelMapper.selectById(36934L);
              HotelDoc hotelDoc = new HotelDoc(hotel);
      
              // 2. 修改数据,如价格
              hotelDoc.setPrice(1999999999);
      
              // 3. 将 hotelDoc 对象转换为 JSON格式的数据
              String json = objectMapper.writeValueAsString(hotelDoc);
      
              // 4. 创建请求对象
              IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
              request.source(json, XContentType.JSON);
      
              // 5. 执行操作
              IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
      
              log.info(response.getId());
          }
      
  • Kibana验证

8.6.2、查询文档

  • 代码如下所示

    •     /**
           * 查询文档
           */
          @Test
          public void testSearchDocument() throws IOException {
              Long id = 36934L;
              // 1. 创建请求
              GetRequest request = new GetRequest("hotel").id(id.toString());
      
              // 2. 执行请求
              GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
      
              // 3. 取出结果
              String hotelDocJson = response.getSourceAsString();
      
              HotelDoc hotelDoc = objectMapper.readValue(hotelDocJson, HotelDoc.class);
      
              log.info(hotelDoc.toString());
          }
      
  • 运行结果如下所示

8.6.3、删除文档

  • 代码如下所示

    •     /**
           * 删除文档
           */
          @Test
          public void testDeleteDocument() throws IOException {
              Long id = 36934L;
              // 1. 创建请求
              DeleteRequest request = new DeleteRequest("hotel").id(id.toString());
      
              // 2. 执行请求
              DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
      
              log.info(response.getId());
      
          }
      
  • Kibana验证

8.7、批量添加

  • Bulk批量操作是将文档的增删改查一些列操作,通过一次请求全都做完。减少网络传输次数

  • 应用场景

    • ES索引库数据初始化的时候,可以将数据库的数据查询出来通过批量操作导入到索引库中
  • 代码如下所示

    •     /**
           * 批量添加文档
           */
          @Test
          public void testBatchAddDocument() throws IOException {
              // 1. 获取需要导入的数据
              List<Hotel> hotelList = hotelMapper.selectList(null);
      
              if(CollectionUtils.isNotEmpty(hotelList)) {
                  // 2. 创建批量操作请求对象
                  BulkRequest bulkRequest = new BulkRequest();
      
                  // 4. 获取文档映射的对象数据
                  for (Hotel hotel : hotelList) {
                      HotelDoc hotelDoc = new HotelDoc(hotel);
      
                      // 5. 创建请求对象
                      IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());;
      
                      // 6. 填充内容
                      String json = objectMapper.writeValueAsString(hotelDoc);
                      request.source(json, XContentType.JSON);
      
                      // 7. 将数据添加到批量操作对象中
                      bulkRequest.add(request);
                  }
                  // 8. 一次性执行批量操作
                  BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
                  log.info(response.status().toString());
              }
          }
      
  • 运行结果如下所示

  • Kibana验证

有关04-HighLevelAPI入门的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  3. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  4. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  5. ES基础入门 - 2

    ES一、简介1、ElasticStackES技术栈:ElasticSearch:存数据+搜索;QL;Kibana:Web可视化平台,分析。LogStash:日志收集,Log4j:产生日志;log.info(xxx)。。。。使用场景:metrics:指标监控…2、基本概念Index(索引)动词:保存(插入)名词:类似MySQL数据库,给数据Type(类型)已废弃,以前类似MySQL的表现在用索引对数据分类Document(文档)真正要保存的一个JSON数据{name:"tcx"}二、入门实战{"name":"DESKTOP-1TSVGKG","cluster_name":"elasticsear

  6. ruby - 在 Ubuntu 14.04 中使用 Curl 安装 RVM 时出错 - 2

    我试图在Ubuntu14.04中使用Curl安装RVM。我运行了以下命令:\curl-sSLhttps://get.rvm.io|bash-sstable出现如下错误:curl:(7)Failedtoconnecttoget.rvm.ioport80:Networkisunreachable非常感谢解决此问题的任何帮助。谢谢 最佳答案 在执行curl之前尝试这个:echoipv4>>~/.curlrc 关于ruby-在Ubuntu14.04中使用Curl安装RVM时出错,我们在Stack

  7. ruby-on-rails - Ubuntu 14.04 Rails 丢失文件 - 2

    安装Rails时,一切都很好,但后来,我写道:rails-v和输出:/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`require':cannotloadsuchfile--rails/cli(LoadError)from/home/toshiba/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`r

  8. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  9. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  10. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

随机推荐