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
  • 前言 當別人做大數據用Java、Python的時候,我使用.NET做大數據、數據挖掘,這確實是值得一說的事。 寫的並不全面,但都是實際工作中的內容。 .NET在大數據項目中,可以做什麼? 寫腳本(使用控制台程式+頂級語句) 寫工具(使用Winform) 寫介面、寫服務 使用C#寫代碼的優點是什麼? ...
  • 前言 本文寫給想學C#的朋友,目的是以儘快的速度入門 C#好學嗎? 對於這個問題,我以前的回答是:好學!但仔細想想,不是這麼回事,對於新手來說,C#沒有那麼好學。 反而學Java還要容易一些,學Java Web就行了,就是SpringBoot那一套。 但是C#方向比較多,你是學控制台程式、WebAP ...
  • 某一日晚上上線,測試同學在回歸項目黃金流程時,有一個工單項目介面報JSF序列化錯誤,馬上升級對應的client包版本,編譯部署後錯誤消失。 線上問題是解決了,但是作為程式員要瞭解問題發生的原因和本質。但這都是為什麼呢? ...
  • 本文介紹基於Python語言中TensorFlow的Keras介面,實現深度神經網路回歸的方法。 1 寫在前面 前期一篇文章Python TensorFlow深度學習回歸代碼:DNNRegressor詳細介紹了基於TensorFlow tf.estimator介面的深度學習網路;而在TensorFl ...
  • 前段時間因業務需要完成了一個工作流組件的編碼工作。藉著這個機會跟大家分享一下整個創作過程,希望大家喜歡,組件暫且命名為"easyFlowable"。 接下來的文章我將從什麼是工作流、為什麼要自研這個工作流組件、架構設計三個維度跟大家來做個整體介紹。 ...
  • 1 簡介 我們之前使用了dapr的本地托管模式,但在生產中我們一般使用Kubernetes托管,本文介紹如何在GKE(GCP Kubernetes)安裝dapr。 相關文章: dapr本地托管的服務調用體驗與Java SDK的Spring Boot整合 dapr入門與本地托管模式嘗試 2 安裝GKE ...
  • 摘要:在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能夠高效的運行。絕大部分的參數保持預設即可。 本文分享自華為雲社區《為什麼需要對jvm進行優化,jvm運行參數之標準參數》,作者:共飲一杯無。 我們為什麼要對jvm做優化? 在本地開發環境中我們很少會遇到需要對jvm進行優化的需 ...
  • 背景 我們的業務共使用11台(阿裡雲)伺服器,使用SpringcloudAlibaba構建微服務集群,共計60個微服務,全部註冊在同一個Nacos集群 流量轉發路徑: nginx->spring-gateway->業務微服務 使用的版本如下: spring-boot.version:2.2.5.RE ...
  • 基於php+webuploader的大文件分片上傳,帶進度條,支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況)。文件上傳前先檢測該文件是否已上傳,如果已上傳提示“文件已存在”,如果未上傳則直接上傳。視頻上傳時會根據設定的參數(分片大小、分片數量)進行上傳,上傳過程中會在目標文件夾中生成一個臨 ...
  • 基於php大文件分片上傳至七牛雲,使用的是七牛雲js-sdk V2版本,引入js文件,配置簡單,可以暫停,暫停後支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況),可以配置分片大小和分片數量,官方文檔https://developer.qiniu.com/kodo/6889/javascrip ...