04-HighLevelAPI入门

打印 上一主题 下一主题

主题 764|帖子 764|积分 2292

八、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的服务端路径配置
      1.   elasticsearch:
      2.     rest:
      3.       uris:
      4.         - http://192.168.222.135:9200
      复制代码

  • 导入相关依赖

      1. <?xml version="1.0" encoding="UTF-8"?>
      2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      3.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
      4.     <modelVersion>4.0.0</modelVersion>
      5.     <parent>
      6.         <groupId>org.springframework.boot</groupId>
      7.         <artifactId>spring-boot-starter-parent</artifactId>
      8.         <version>2.3.8.RELEASE</version>
      9.         <relativePath/>
      10.     </parent>
      11.     <groupId>com.coolman.hotel</groupId>
      12.     <artifactId>hotel-demo</artifactId>
      13.     <name>hotel-demo</name>
      14.     <description>Demo project for Spring Boot</description>
      15.     <properties>
      16.         <java.version>1.8</java.version>
      17.     </properties>
      18.     <dependencies>
      19.         <dependency>
      20.             <groupId>org.springframework.boot</groupId>
      21.             <artifactId>spring-boot-starter-web</artifactId>
      22.         </dependency>
      23.         <dependency>
      24.             <groupId>com.baomidou</groupId>
      25.             <artifactId>mybatis-plus-boot-starter</artifactId>
      26.             <version>3.1.1</version>
      27.         </dependency>
      28.         <dependency>
      29.             <groupId>mysql</groupId>
      30.             <artifactId>mysql-connector-java</artifactId>
      31.             <version>8.0.27</version>
      32.             <scope>runtime</scope>
      33.         </dependency>
      34.         <dependency>
      35.             <groupId>org.projectlombok</groupId>
      36.             <artifactId>lombok</artifactId>
      37.             <optional>true</optional>
      38.         </dependency>
      39.         <dependency>
      40.             <groupId>org.springframework.boot</groupId>
      41.             <artifactId>spring-boot-starter-test</artifactId>
      42.             <scope>test</scope>
      43.         </dependency>
      44.                 <dependency>
      45.             <groupId>org.apache.commons</groupId>
      46.             <artifactId>commons-lang3</artifactId>
      47.         </dependency>
      48.         
      49.         <dependency>
      50.             <groupId>org.elasticsearch.client</groupId>
      51.             <artifactId>elasticsearch-rest-high-level-client</artifactId>
      52.         </dependency>
      53.     </dependencies>
      54.     <build>
      55.         <plugins>
      56.             <plugin>
      57.                 <groupId>org.springframework.boot</groupId>
      58.                 <artifactId>spring-boot-maven-plugin</artifactId>
      59.                 <configuration>
      60.                     <excludes>
      61.                         <exclude>
      62.                             <groupId>org.projectlombok</groupId>
      63.                             <artifactId>lombok</artifactId>
      64.                         </exclude>
      65.                     </excludes>
      66.                 </configuration>
      67.             </plugin>
      68.         </plugins>
      69.     </build>
      70. </project>
      复制代码

  • 编写测试类,验证是否可以正常连接

      1. package com.coolman.hotel.test;
      2. import lombok.extern.slf4j.Slf4j;
      3. import org.elasticsearch.client.RestHighLevelClient;
      4. import org.junit.jupiter.api.Test;
      5. import org.springframework.beans.factory.annotation.Autowired;
      6. import org.springframework.boot.test.context.SpringBootTest;
      7. @SpringBootTest
      8. @Slf4j
      9. public class TestConnectES {
      10.     @Autowired
      11.     private RestHighLevelClient restHighLevelClient;
      12.     @Test
      13.     public void testConnect() {
      14.       log.info(restHighLevelClient + "");
      15.     }
      16. }
      复制代码


8.2、创建索引


  • 代码如下所示

      1.     /**
      2.      * 创建索引测试
      3.      */
      4.     @Test
      5.     public void testCreateIndex() throws IOException {
      6.         // 1. 获取索引操作对象
      7.         IndicesClient indicesClient = restHighLevelClient.indices();
      8.         // 2. 创建索引对象
      9.         CreateIndexRequest request = new CreateIndexRequest("hotel");// 相当于DSL语句的 PUT hotel 请求,但是还没执行
      10.         // 3. 执行操作
      11.         CreateIndexResponse response = indicesClient.create(request, RequestOptions.DEFAULT);
      12.         // 4. 获取结果
      13.         log.info(response.isAcknowledged() + "");
      14.     }
      复制代码

  • 运行结果如下所示



  • Kibana验证



8.3、添加映射


  • 代码如下所示

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

        1. DELETE hotel
        2. GET hotel/_mapping
        3. # 分析hotel索引库的映射结构
        4. # index属性:是否建立索引,默认值true,如果该字段不用查询,则设置false
        5. # copy_to: 把指定字段的值拷贝到另一个字段上
        6. PUT hotel
        7. {
        8.   "mappings": {
        9.     "properties": {
        10.       "id": {
        11.         "type": "keyword"
        12.       },
        13.       "name": {
        14.         "type": "text",
        15.         "analyzer": "ik_smart",
        16.         "copy_to": "all"
        17.       },
        18.       "address": {
        19.         "type": "text",
        20.         "analyzer": "ik_smart"
        21.       },
        22.       "price": {
        23.         "type": "integer"
        24.       },
        25.       "score": {
        26.         "type": "integer"
        27.       },
        28.       "brand": {
        29.         "type": "keyword",
        30.         "copy_to": "all"
        31.       },
        32.       "city": {
        33.         "type": "keyword"
        34.       },
        35.       "starName": {
        36.         "type": "keyword"
        37.       },
        38.       "business": {
        39.         "type": "keyword",
        40.         "copy_to": "all"
        41.       },
        42.       "location": {
        43.         "type": "geo_point"
        44.       },
        45.       "pic": {
        46.         "type": "keyword",
        47.         "index": false
        48.       },
        49.       "isAD": {
        50.         "type": "boolean"
        51.       },
        52.       "all": {
        53.         "type": "text",
        54.         "analyzer": "ik_smart"
        55.       }
        56.     }
        57.   }
        58. }
        复制代码

    • 创建成功后,再删除,将mappings中的字段复制到Java代码中
      1.     /**
      2.      * 添加映射测试
      3.      */
      4.     @Test
      5.     public void testAddMapping() throws IOException {
      6.         // 1. 创建索引操作对象
      7.         IndicesClient indicesClient = restHighLevelClient.indices();
      8.         // 2. 创建索引
      9.         CreateIndexRequest request = new CreateIndexRequest("hotel");
      10.         // 3. 定义mapping语句
      11.         String mapping = "{\n" +
      12.                 "    "properties": {\n" +
      13.                 "      "id": {\n" +
      14.                 "        "type": "keyword"\n" +
      15.                 "      },\n" +
      16.                 "      "name": {\n" +
      17.                 "        "type": "text",\n" +
      18.                 "        "analyzer": "ik_smart",\n" +
      19.                 "        "copy_to": "all"\n" +
      20.                 "      },\n" +
      21.                 "      "address": {\n" +
      22.                 "        "type": "text",\n" +
      23.                 "        "analyzer": "ik_smart"\n" +
      24.                 "      },\n" +
      25.                 "      "price": {\n" +
      26.                 "        "type": "integer"\n" +
      27.                 "      },\n" +
      28.                 "      "score": {\n" +
      29.                 "        "type": "integer"\n" +
      30.                 "      },\n" +
      31.                 "      "brand": {\n" +
      32.                 "        "type": "keyword",\n" +
      33.                 "        "copy_to": "all"\n" +
      34.                 "      },\n" +
      35.                 "      "city": {\n" +
      36.                 "        "type": "keyword"\n" +
      37.                 "      },\n" +
      38.                 "      "starName": {\n" +
      39.                 "        "type": "keyword"\n" +
      40.                 "      },\n" +
      41.                 "      "business": {\n" +
      42.                 "        "type": "keyword",\n" +
      43.                 "        "copy_to": "all"\n" +
      44.                 "      },\n" +
      45.                 "      "location": {\n" +
      46.                 "        "type": "geo_point"\n" +
      47.                 "      },\n" +
      48.                 "      "pic": {\n" +
      49.                 "        "type": "keyword",\n" +
      50.                 "        "index": false\n" +
      51.                 "      },\n" +
      52.                 "      "isAD": {\n" +
      53.                 "        "type": "boolean"\n" +
      54.                 "      },\n" +
      55.                 "      "all": {\n" +
      56.                 "        "type": "text",\n" +
      57.                 "        "analyzer": "ik_smart"\n" +
      58.                 "      }\n" +
      59.                 "    }\n" +
      60.                 "  }";
      61.         request.mapping(mapping, XContentType.JSON);    // 设置mappings字段,并指定其内容为json格式
      62.         // 4. 执行操作
      63.         CreateIndexResponse response = indicesClient.create(request, RequestOptions.DEFAULT);
      64.         // 5. 获取结果
      65.         log.info(response.isAcknowledged() + "");
      66.     }
      复制代码


  • 运行结果如下所示



  • Kibana验证



8.4、删除索引


  • 代码如下所示

      1.     /**
      2.      * 删除索引测试
      3.      */
      4.     @Test
      5.     public void testDeleteIndex() throws IOException {
      6.         // 1. 获取索引操作对象
      7.         IndicesClient indicesClient = restHighLevelClient.indices();
      8.         
      9.         // 2. 获取索引对象
      10.         DeleteIndexRequest request = new DeleteIndexRequest("hotel");   // DELETE hotel
      11.         // 3. 执行操作
      12.         AcknowledgedResponse response = indicesClient.delete(request, RequestOptions.DEFAULT);
      13.         // 4. 获取结果
      14.         log.info("" + response.isAcknowledged());
      15.     }
      复制代码

  • 比较简单,自行验证即可
8.5、添加文档


  • 代码如下所示

      1.     /**
      2.      * 添加文档测试
      3.      */
      4. // Jackson
      5.     private ObjectMapper objectMapper = new ObjectMapper();
      6.     @Test
      7.     public void testAddDocument() throws IOException {
      8.         // 先获取 指定的 hotel数据
      9.         Hotel hotel = hotelMapper.selectById(36934);
      10.         HotelDoc hotelDoc = new HotelDoc(hotel);
      11.         // 1. 创建请求对象
      12.         IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
      13.         // 2. 填充文档内容
      14.         String json = objectMapper.writeValueAsString(hotelDoc);
      15.         request.source(json, XContentType.JSON);
      16.         // 3. 执行请求体对象
      17.         IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
      18.         // 4. 获取结果
      19.         log.info(response.getId() + "");
      20.     }
      复制代码

  • Kibana验证



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

8.6.1、修改文档

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


  • 代码如下所示

      1.     /**
      2.      * 修改文档
      3.      */
      4.     @Test
      5.     public void testUpdateDocument() throws IOException {
      6.         // 1. 先获取 指定的 hotel 数据
      7.         Hotel hotel = hotelMapper.selectById(36934L);
      8.         HotelDoc hotelDoc = new HotelDoc(hotel);
      9.         // 2. 修改数据,如价格
      10.         hotelDoc.setPrice(1999999999);
      11.         // 3. 将 hotelDoc 对象转换为 JSON格式的数据
      12.         String json = objectMapper.writeValueAsString(hotelDoc);
      13.         // 4. 创建请求对象
      14.         IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());
      15.         request.source(json, XContentType.JSON);
      16.         // 5. 执行操作
      17.         IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
      18.         log.info(response.getId());
      19.     }
      复制代码

  • Kibana验证



8.6.2、查询文档


  • 代码如下所示

      1.     /**
      2.      * 查询文档
      3.      */
      4.     @Test
      5.     public void testSearchDocument() throws IOException {
      6.         Long id = 36934L;
      7.         // 1. 创建请求
      8.         GetRequest request = new GetRequest("hotel").id(id.toString());
      9.         // 2. 执行请求
      10.         GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
      11.         // 3. 取出结果
      12.         String hotelDocJson = response.getSourceAsString();
      13.         HotelDoc hotelDoc = objectMapper.readValue(hotelDocJson, HotelDoc.class);
      14.         log.info(hotelDoc.toString());
      15.     }
      复制代码

  • 运行结果如下所示



8.6.3、删除文档


  • 代码如下所示

      1.     /**
      2.      * 删除文档
      3.      */
      4.     @Test
      5.     public void testDeleteDocument() throws IOException {
      6.         Long id = 36934L;
      7.         // 1. 创建请求
      8.         DeleteRequest request = new DeleteRequest("hotel").id(id.toString());
      9.         // 2. 执行请求
      10.         DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
      11.         log.info(response.getId());
      12.     }
      复制代码

  • Kibana验证



8.7、批量添加


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

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

  • 代码如下所示

      1.     /**
      2.      * 批量添加文档
      3.      */
      4.     @Test
      5.     public void testBatchAddDocument() throws IOException {
      6.         // 1. 获取需要导入的数据
      7.         List<Hotel> hotelList = hotelMapper.selectList(null);
      8.         if(CollectionUtils.isNotEmpty(hotelList)) {
      9.             // 2. 创建批量操作请求对象
      10.             BulkRequest bulkRequest = new BulkRequest();
      11.             // 4. 获取文档映射的对象数据
      12.             for (Hotel hotel : hotelList) {
      13.                 HotelDoc hotelDoc = new HotelDoc(hotel);
      14.                 // 5. 创建请求对象
      15.                 IndexRequest request = new IndexRequest("hotel").id(hotelDoc.getId().toString());;
      16.                 // 6. 填充内容
      17.                 String json = objectMapper.writeValueAsString(hotelDoc);
      18.                 request.source(json, XContentType.JSON);
      19.                 // 7. 将数据添加到批量操作对象中
      20.                 bulkRequest.add(request);
      21.             }
      22.             // 8. 一次性执行批量操作
      23.             BulkResponse response = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
      24.             log.info(response.status().toString());
      25.         }
      26.     }
      复制代码

  • 运行结果如下所示



  • Kibana验证




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表