04-HighLevelAPI入門

来源:https://www.cnblogs.com/OnlyOnYourself-lzw/archive/2022/08/07/16559764.html
-Advertisement-
Play Games

八、HighLevelAPI 8.1、RestAPI介紹&項目導入 8.1.1、RestAPI介紹 ES官方提供了各種不同語言的客戶端,用來操作ES。這些客戶端的本質就是組裝DSL語句,通過http請求發送給ES 官方文檔地址 https://www.elastic.co/guide/en/elas ...


八、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驗證


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 由於業務需求,需要有一個圖片標記功能,其實就是對圖片畫框畫線做標記,類似微信的圖片編輯 但是需要存下標記圖及其標記的具體數據,。功能其實很簡單,但剛開始的時候也是費了一些功夫的。我將原項目中該功能抽離出來單獨寫了一個demo,作為記錄,同時你們在開發過程中有類似需求的話也可以參考一下該思路,其 ...
  • 原文鏈接:20 多個好用的 Vue 組件庫 在本文中,將分享一些常見的 vue.js 組件。 Tables / Data Grids Vue Tables-2 地址:https://github.com/matfish2/vue-tables-2 Vue Tables 2 旨在為開發者提供一個功能齊 ...
  • HashMap概要 代碼如果沒有特定說明,為JDK 1.8 HashMap用來存放鍵值對,是Map介面的實現,是非線程安全的 可以存儲key和value為null的值,但key為null的節點只能有一個 哈希值的計算:在hashCode的基礎上添加擾動函數,使元素分佈更加隨機 哈希衝突:通過鏈表存儲 ...
  • 一、Apach POI處理Excel的方式: 傳統Excel操作或者解析都是利用Apach POI進行操作,POI中處理Excel有以下幾種方式: 1、HSSFWorkbook: HSSFWorkbook用來處理.xls尾碼的Excel,即適用於Excel2003以前(包括2003)的版本。因為其最 ...
  • 精華筆記: 什麼是類?什麼是對象? 現實生活中是由很多很多對象組成的,基於對象抽出了類 對象:軟體中真實存在的單個個體/東西 類:類型/類別,代表一類個體 類是對象的模板/模子,對象是類的具體的實例 類中可以包含: 對象的屬性/特征 成員變數 對象的行為/動作/功能 方法 一個類可以創建多個對象 如 ...
  • doc或docx(word)或image類型文件批量轉PDF腳本 1.實際生產環境中遇到文件展示只能適配PDF版本的文件,奈何一萬個文件有七千個都是word或者image類型的,由此搞個腳本批量轉換下上傳至OSS,為前端提供數據支撐。 2.環境準備,這裡使用的是aspose-words-18.6-j ...
  • 一、菜單 功能描述:顯示簡單的菜單,供用戶選擇操作 實現步驟:直接cout輸出 二、退出功能 功能描述:根據用戶不同的操作代碼選擇,進入不同的功能,我們使用switch分支結構進行搭建 實現步驟:用while(ture)迴圈包涵switch, case 0:時用return 0 ,退出迴圈,即退出通 ...
  • 序列類型 字元串 由很多個字元組成的字元序列,字元串屬於 **序列類型 序列簡介 數值類型:可以表示 數字,數值 int float bool 序列類型:存儲多個數據的一種數據類型 str : 可以存儲數字,字母,特殊符號,中文等數據.表現形式為 一對引號包囊起來的數據 list 列表 tuple ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...