百木园-与人分享,
就是让自己快乐。

04-HighLevelAPI入门

八、HighLevelAPI

8.1、RestAPI介绍&项目导入

8.1.1、RestAPI介绍

  • ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES
  • 官方文档地址
    • https://www.elastic.co/guide/en/elasticsearch/client/index.html
  • 其中的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验证


来源:https://www.cnblogs.com/OnlyOnYourself-lzw/p/16559764.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 04-HighLevelAPI入门

相关推荐

  • 暂无文章