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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...