国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入

這篇具有很好參考價(jià)值的文章主要介紹了【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


前言

ElasticSearch 官方提供了各種不同語言的客戶端,用來操作 ES。這些客戶端的本質(zhì)就是組裝 DSL 語句,通過 HTTP 請(qǐng)求發(fā)送給 ES 服務(wù)器。

官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html。

在本文中,我們將著重介紹 ElasticSearch Java 客戶端中的 RestClient,并演示如何使用它實(shí)現(xiàn)對(duì)索引庫和文檔的各種操作。

一、對(duì) Java RestClient 的認(rèn)識(shí)

1.1 什么是 RestClient

RestClient 是 ElasticSearch 提供的用于與 ElasticSearch 集群進(jìn)行通信的 Java 客戶端。它提供了一種簡單而靈活的方式來執(zhí)行 REST 請(qǐng)求,并處理響應(yīng)。通過 RestClient,我們可以輕松地在 Java 中操作 ElasticSearch。

在 ES 官方文檔中看到 Java 的 RestClient 分為 High level REST clientLow level REST client

【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入,微服務(wù),ElasticSearch,elasticsearch,RestClient

它們之間的區(qū)別:

  1. High Level REST Client:

    • 面向?qū)ο螅禾峁┝烁用嫦驅(qū)ο蟮腁PI,簡化了復(fù)雜的操作,使用起來更加方便。
    • 使用場景:適用于絕大多數(shù)的操作,特別是對(duì)于復(fù)雜的操作,比如查詢、索引、更新等。
  2. Low Level REST Client:

    • 更接近 HTTP 層:提供的是與 Elasticsearch REST API 一一對(duì)應(yīng)的方法,更加靈活,適用于特定場景的定制化需求。
    • 使用場景:適用于對(duì)于 Elasticsearch 提供的 REST API 進(jìn)行細(xì)粒度控制的情況,比如處理特殊的請(qǐng)求和響應(yīng)。

1.2 RestClient 核心類:RestHighLevelClient

RestHighLevelClient 是 Elasticsearch Java 客戶端中的高級(jí)客戶端,提供了更加方便和抽象的操作方式,適用于大多數(shù)的 Elasticsearch 操作。在使用 RestHighLevelClient 之前,需要?jiǎng)?chuàng)建一個(gè) RestClient 實(shí)例,并將其包裝在 RestHighLevelClient 中。

主要功能和特點(diǎn):

  1. 面向?qū)ο蟮牟僮?/strong>:RestHighLevelClient 提供了更加面向?qū)ο蟮?API,使得 Elasticsearch 操作更加符合 Java 開發(fā)的習(xí)慣,易于理解和使用。

  2. 內(nèi)置序列化和反序列化:RestHighLevelClient 內(nèi)置了 Jackson 庫,可以自動(dòng)序列化和反序列化 Elasticsearch 的請(qǐng)求和響應(yīng),無需手動(dòng)處理 JSON 數(shù)據(jù)。

  3. 復(fù)雜查詢支持:支持復(fù)雜的 Elasticsearch 查詢操作,如布爾查詢、范圍查詢、聚合查詢等。

  4. 錯(cuò)誤處理:提供了異常處理機(jī)制,能夠更好地捕獲和處理 Elasticsearch 操作中的錯(cuò)誤。

  5. 并發(fā)性:RestHighLevelClient 可以處理多個(gè)并發(fā)請(qǐng)求,是多線程安全的。

常用操作和方法:

以下是 RestHighLevelClient 類的一些常用操作和方法,通過這些方法可以實(shí)現(xiàn)對(duì) Elasticsearch 的索引庫和文檔的各種操作:

操作 方法 描述
索引文檔 IndexResponse index(IndexRequest request, RequestOptions options) 向指定索引插入文檔
獲取文檔 GetResponse get(GetRequest request, RequestOptions options) 根據(jù)文檔 ID 獲取文檔
刪除文檔 DeleteResponse delete(DeleteRequest request, RequestOptions options) 根據(jù)文檔 ID 刪除文檔
更新文檔 UpdateResponse update(UpdateRequest request, RequestOptions options) 根據(jù)文檔 ID 更新文檔
批量操作 BulkResponse bulk(BulkRequest request, RequestOptions options) 批量執(zhí)行操作
查詢 SearchResponse search(SearchRequest request, RequestOptions options) 執(zhí)行搜索查詢
聚合查詢 SearchResponse search(SearchRequest request, RequestOptions options) 執(zhí)行聚合查詢
清理滾動(dòng) ClearScrollResponse clearScroll(ClearScrollRequest request, RequestOptions options) 清理滾動(dòng)上下文

以上只是 RestHighLevelClient 類的一部分方法,更多詳細(xì)的操作和方法請(qǐng)參考 官方文檔。這些方法提供了豐富的功能,可以滿足各種 Elasticsearch 操作的需求。

二、使用 Java RestClient 操作索引庫

2.1 根據(jù)數(shù)據(jù)庫表編寫創(chuàng)建 ES 索引的 DSL 語句

當(dāng)需要將已有的數(shù)據(jù)庫數(shù)據(jù)導(dǎo)入到 Elasticsearch 索引中時(shí),首先需要定義好 Elasticsearch 索引的 mapping 結(jié)構(gòu),這樣 Elasticsearch 才能正確解析和存儲(chǔ)數(shù)據(jù)。

在這個(gè)例子中,我們有一個(gè)名為 hotel 的數(shù)據(jù)庫表,它有各種不同類型的字段,包括文本、數(shù)字、地理坐標(biāo)等。讓我們逐步解釋如何根據(jù)數(shù)據(jù)庫表的結(jié)構(gòu)編寫創(chuàng)建 Elasticsearch 索引的 DSL(Domain Specific Language)語句。

  1. 數(shù)據(jù)庫表結(jié)構(gòu)分析

首先,讓我們來看一下 hotel 表的結(jié)構(gòu):

+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | bigint       | NO   | PRI | NULL    |       |
| name      | varchar(255) | NO   |     | NULL    |       |
| address   | varchar(255) | NO   |     | NULL    |       |
| price     | int          | NO   |     | NULL    |       |
| score     | int          | NO   |     | NULL    |       |
| brand     | varchar(32)  | NO   |     | NULL    |       |
| city      | varchar(32)  | NO   |     | NULL    |       |
| star_name | varchar(16)  | YES  |     | NULL    |       |
| business  | varchar(255) | YES  |     | NULL    |       |
| latitude  | varchar(32)  | NO   |     | NULL    |       |
| longitude | varchar(32)  | NO   |     | NULL    |       |
| pic       | varchar(255) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+

這個(gè)表包含了以下字段:

  • id:長整型(bigint
  • name:文本字符串(varchar),用于存儲(chǔ)酒店名稱
  • address:文本字符串,用于存儲(chǔ)酒店地址
  • price:整數(shù)(int),表示酒店價(jià)格
  • score:整數(shù),表示酒店評(píng)分
  • brand:文本字符串,用于存儲(chǔ)酒店品牌
  • city:文本字符串,用于存儲(chǔ)城市名稱
  • star_name:文本字符串,用于存儲(chǔ)星級(jí)名稱(可為空)
  • business:文本字符串,用于存儲(chǔ)營業(yè)信息(可為空)
  • latitude:文本字符串,用于存儲(chǔ)緯度坐標(biāo)
  • longitude:文本字符串,用于存儲(chǔ)經(jīng)度坐標(biāo)
  • pic:文本字符串,用于存儲(chǔ)圖片路徑(可為空)
  1. 創(chuàng)建 Elasticsearch 索引的 DSL

現(xiàn)在,讓我們將上述數(shù)據(jù)庫表的結(jié)構(gòu)映射到 Elasticsearch 索引的 DSL 中:

PUT /hotel
{
  "mappings": {
    "properties": {
      "id": {
        "type": "long"
      },
      "name": {
        "type": "text",
        "analyzer": "ik_max_word",
        "copy_to": "all"
      },
      "address": {
        "type": "keyword",
        "index": false
      },
      "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
      },
      "all": {
        "type": "text",
        "analyzer": "ik_max_word"
      }
    }
  }
}

重要說明:

  1. 地理坐標(biāo) (location) 字段:

在 MySQL 數(shù)據(jù)庫表中,地理坐標(biāo)是使用 latitudelongitude 兩個(gè)字段表示的。但在 Elasticsearch 中,我們使用 geo_point 類型來表示地理坐標(biāo)。

  • geo_point:由緯度(latitude)和經(jīng)度(longitude)確定的一個(gè)點(diǎn)。例如:“32.8752345, 120.2981576”。

補(bǔ)充:ES 中支持兩種地理坐標(biāo)數(shù)據(jù)類型

  • geo_point:由緯度(latitude)和經(jīng)度(longitude)確定的一個(gè)點(diǎn)。例如:"32.8752345, 120.2981576"
  • geo_shape:有多個(gè)geo_point組成的復(fù)雜幾何圖形。例如一條直線:"LINESTRING (-77.03653 38.897676, -77.009051 38.889939)"。
  1. 字段拷貝:

字段拷貝的目的是在搜索時(shí),同時(shí)匹配多個(gè)字段。我們使用 copy_to 屬性將當(dāng)前字段拷貝到指定字段。這樣,在搜索時(shí),可以同時(shí)匹配 name、brandbusiness 字段。

示例:

"all": {
  "type": "text",
  "analyzer": "ik_max_word"
},
"brand": {
  "type": "keyword",
  "copy_to": "all"
}
  1. 映射規(guī)則總結(jié)

Elasticsearch 對(duì)不同類型的字段有不同的映射規(guī)則,以下是常見類型的映射規(guī)則:

  • 字符串 (textkeyword): text 用于全文搜索,支持分詞;keyword 用于精確匹配,不分詞。
  • 整數(shù) (integer): 用于存儲(chǔ)整數(shù)。
  • 長整型 (long): 用于存儲(chǔ)長整數(shù)。
  • 浮點(diǎn)數(shù) (float): 用于存儲(chǔ)浮點(diǎn)數(shù)。
  • 地理坐標(biāo) (geo_point): 用于存儲(chǔ)地理坐標(biāo)。
  • 日期 (date): 用于存儲(chǔ)日期時(shí)間。

通過正確定義索引的映射規(guī)則,我們可以更有效地利用 Elasticsearch 的搜索和分析功能。

2.2 初始化 Java RestClient

2.2.1 在 Spring Boot 項(xiàng)目中引入 RestHighLevelClient 的依賴

首先在 pom.xml 中引入依賴

<!--ElasticSearch 客戶端依賴-->
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.12.1</version>
</dependency>

此次引入的版本是 7.12.1 版本的,目的是與ElasticSearch 服務(wù)器的版本相同。刷新 Maven 之后,發(fā)現(xiàn) elasticsearch-rest-high-level-client依賴中某些組件的版本并不是7.12.1的:

【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入,微服務(wù),ElasticSearch,elasticsearch,RestClient

其原因是 Spring Boot 已經(jīng)自動(dòng)為我們管理了一些依賴,其中就包括了elasticsearch,其版本就是 7.6.2的。

【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入,微服務(wù),ElasticSearch,elasticsearch,RestClient
因此我們需要做的就是在 pom.xml 覆蓋這個(gè)配置,即在 properties 中指定版本為 7.12.1
【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入,微服務(wù),ElasticSearch,elasticsearch,RestClient
再次刷新 Maven,就能夠發(fā)現(xiàn)所有組件的版本都是 7.12.1 了:

【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入,微服務(wù),ElasticSearch,elasticsearch,RestClient

2.2.2 編寫 HotelIndexTests 單元測試類,完成 RestHighLevelClient 的初始化

@SpringBootTest
class HotelIndexTests {
    private RestHighLevelClient client;

    @BeforeEach
    void setUp() {
        this.client = new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.248.128:9200")
        ));
    }

    @AfterEach
    void tearDown() throws IOException {
        this.client.close();
    }
    /**
     * 測試初始化客戶端
     */
    @Test
    void testInit() {
        System.out.println(client);
    }
}

對(duì)上述代碼的說明:

  • 在上述代碼中,通過 RestClient.builder 構(gòu)建了 RestHighLevelClient 實(shí)例,并指定了 ElasticSearch 服務(wù)器的地址為 http://192.168.248.128:9200。這是一個(gè)簡單的單元測試,用于驗(yàn)證客戶端的初始化是否成功。
  • @BeforeEach 注解的方法中,我們創(chuàng)建了 RestHighLevelClient 的實(shí)例,而在 @AfterEach 注解的方法中,我們關(guān)閉了客戶端。這是為了保證測試用例執(zhí)行前后,客戶端都能夠正確地被初始化和關(guān)閉。
  • 在測試方法 testInit 中,我們簡單地打印了客戶端對(duì)象,以驗(yàn)證其初始化是否成功。

在接下來的內(nèi)容中,我們將繼續(xù)使用編寫單元測試方法,執(zhí)行一系列對(duì) ElasticSearch 索引庫和文檔的操作。

2.3 創(chuàng)建索引庫

創(chuàng)建 hotel 索引庫會(huì)使用到前文根據(jù) hotle 表結(jié)構(gòu)編寫的 DSL mapping 映射,在Java代碼中,我們需要將其封裝成一個(gè)全局常量,例如,將其保存到名為 MAPPING_TEMPLATE 的常量字符串中:

public class HotelConstants {
    public static final String MAPPING_TEMPLATE = "{\n" +
            "  \"mappings\": {\n" +
            "    \"properties\": {\n" +
            "      \"id\": {\n" +
            "        \"type\": \"long\"\n" +
            "      },\n" +
            "      \"name\": {\n" +
            "        \"type\": \"text\",\n" +
            "        \"analyzer\": \"ik_max_word\",\n" +
            "        \"copy_to\": \"all\"\n" +
            "      },\n" +
            "      \"address\": {\n" +
            "        \"type\": \"keyword\",\n" +
            "        \"index\": false\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" +
            "      \"all\": {\n" +
            "        \"type\": \"text\",\n" +
            "        \"analyzer\": \"ik_max_word\"\n" +
            "      }\n" +
            "    }\n" +
            "  }\n" +
            "}";
}

下面是創(chuàng)建索引庫的單元測試方:

    /**
     * 創(chuàng)建索引庫
     *
     * @throws IOException 拋出異常
     */
    @Test
    void testCreateHotelIndex() throws IOException {
        // 1. 創(chuàng)建 Request 對(duì)象
        CreateIndexRequest request = new CreateIndexRequest("hotel");

        // 2. 準(zhǔn)備請(qǐng)求參數(shù):DSL 語句
        request.source(MAPPING_TEMPLATE, XContentType.JSON);

        // 3. 發(fā)起請(qǐng)求
        client.indices().create(request, RequestOptions.DEFAULT);
    }

對(duì)上述代碼的說明:

  1. 創(chuàng)建 CreateIndexRequest 對(duì)象,指定索引庫的名稱為 "hotel"
  2. 準(zhǔn)備請(qǐng)求參數(shù),即 DSL 語句,使用 MAPPING_TEMPLATE 常量。
  3. 發(fā)起創(chuàng)建索引庫的請(qǐng)求,通過 client.indices().create(request, RequestOptions.DEFAULT) 執(zhí)行。

這樣,我們就完成了通過 Java RestClient 創(chuàng)建 ElasticSearch 索引庫的操作。在實(shí)際應(yīng)用中,創(chuàng)建索引庫是一個(gè)初始化工作,通常在應(yīng)用啟動(dòng)時(shí)執(zhí)行一次即可。

2.4 刪除索引庫

以下是使用 Java RestClient 刪除名為 “hotel” 的索引庫的單元測試方法:

/**
 * 刪除索引庫
 * @throws IOException 拋出異常
 */
@Test
void testDeleteHotelIndex() throws IOException {
    // 1. 創(chuàng)建 Request 對(duì)象
    DeleteIndexRequest request = new DeleteIndexRequest("hotel");

    // 2. 發(fā)起請(qǐng)求
    client.indices().delete(request, RequestOptions.DEFAULT);
}

對(duì)上述代碼的說明:

  1. 創(chuàng)建 DeleteIndexRequest 對(duì)象,指定要?jiǎng)h除的索引庫名稱為 “hotel”。
  2. 發(fā)起刪除索引庫的請(qǐng)求,通過 client.indices().delete(request, RequestOptions.DEFAULT) 執(zhí)行。

這個(gè)方法主要用于清理測試環(huán)境或者在應(yīng)用退出時(shí)執(zhí)行,以確保數(shù)據(jù)的整潔和安全。

刪除索引庫的操作需要謹(jǐn)慎執(zhí)行,因?yàn)樗鼤?huì)將整個(gè)索引庫以及其中的所有文檔都刪除,且無法恢復(fù)。在實(shí)際應(yīng)用中,通常會(huì)設(shè)置一些安全機(jī)制來避免誤操作。

2.5 判斷索引庫是否存在

在 Elasticsearch 中,我們可以通過 Java RestClient 來判斷指定的索引庫是否存在。以下是一個(gè)示例代碼:

@Test
void testExistsHotelIndex() throws IOException {
    // 1. 創(chuàng)建 GetIndexRequest 對(duì)象,指定要判斷是否存在的索引庫名稱為 "hotel"
    GetIndexRequest request = new GetIndexRequest("hotel");
    
    // 2. 發(fā)起請(qǐng)求,執(zhí)行判斷索引庫是否存在的操作
    boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);
    
    // 3. 打印判斷結(jié)果
    System.out.println(exists ? "索引庫存在" : "索引庫不存在");
}

在這個(gè)方法中,首先創(chuàng)建了一個(gè) GetIndexRequest 對(duì)象,指定了要判斷是否存在的索引庫名稱為 “hotel”。然后,通過 client.indices().exists(request, RequestOptions.DEFAULT) 發(fā)起請(qǐng)求,執(zhí)行判斷索引庫是否存在的操作。最后,根據(jù)返回的布爾值,輸出相應(yīng)的提示信息。

這個(gè)方法通常用于在進(jìn)行其他操作之前,先判斷索引庫是否存在,以確保我們不會(huì)對(duì)不存在的索引庫執(zhí)行其他操作。

三、使用 Java RestClient 實(shí)現(xiàn)對(duì)文檔的增刪改查

3.1 新增文檔

在新增文檔之前,首先需要從數(shù)據(jù)庫中去查詢一條記錄,然后再將查詢到的記錄保存到 ES 文檔中。例如,現(xiàn)在有一條 id=61083的酒店數(shù)據(jù),我們需要把它查詢出來,然后添加到文檔中:

【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入,微服務(wù),ElasticSearch,elasticsearch,RestClient

首先同樣需要?jiǎng)?chuàng)建一個(gè)測試類HotelDocumentTests,并完成 RestHighLevelClient 的初始化。然后新增文檔的測試代碼如下:

@Test
void testAddDocument() throws IOException {
    // 根據(jù)id查詢酒店
    Hotel hotel = hotelService.getById(61083L);
    // 轉(zhuǎn)換為文檔類型
    HotelDoc hotelDoc = new HotelDoc(hotel);

    // 1. 準(zhǔn)備 Request 對(duì)象
    IndexRequest request = new IndexRequest("hotel").id(hotel.getId().toString());

    // 2. 準(zhǔn)備 JSON 文檔
    request.source(JSON.toJSONString(hotelDoc), XContentType.JSON);

    // 3. 發(fā)送請(qǐng)求
    client.index(request, RequestOptions.DEFAULT);
}

對(duì)上述代碼的說明:

  1. 根據(jù) ID 查詢酒店數(shù)據(jù): 使用 hotelService.getById(61083L) 方法從數(shù)據(jù)庫中根據(jù)酒店 ID(這里是 61083L)查詢酒店數(shù)據(jù)并封裝到 Hotel 對(duì)象中。

  2. 轉(zhuǎn)換為文檔類型: 將查詢到的 Hotel 類型轉(zhuǎn)換為HotelDoc文檔類型,因?yàn)閿?shù)據(jù)庫和文檔中表示經(jīng)緯度的方式不同。

  3. 準(zhǔn)備 IndexRequest 對(duì)象: 創(chuàng)建 IndexRequest 對(duì)象,指定索引庫名稱為 “hotel”,并設(shè)置文檔 ID 為酒店的 ID(使用 hotel.getId().toString() 獲取 ID 的字符串表示)。

  4. 準(zhǔn)備 JSON 文檔:HotelDoc 對(duì)象轉(zhuǎn)換為 JSON 格式的字符串,使用 JSON.toJSONString(hotelDoc) 實(shí)現(xiàn)轉(zhuǎn)換。

  5. 發(fā)送請(qǐng)求: 使用 client.index(request, RequestOptions.DEFAULT) 發(fā)送請(qǐng)求,將準(zhǔn)備好的文檔添加到索引庫中。

這個(gè)測試方法演示了如何通過 Java RestClient 向 Elasticsearch 索引庫中新增文檔。

3.2 獲取文檔

獲取指定文檔的測試方法的代碼如下:

@Test
void testGetDocument() throws IOException {
    // 1. 創(chuàng)建 Request 對(duì)象
    GetRequest request = new GetRequest("hotel", "61083");

    // 2. 發(fā)送請(qǐng)求,獲取結(jié)果
    GetResponse response = client.get(request, RequestOptions.DEFAULT);

    // 3. 解析結(jié)果
    String json = response.getSourceAsString();

    // 4. 將字符串解析為 HotelDoc 對(duì)象
    HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);

    System.out.println(hotelDoc);
}

對(duì)該方法的詳細(xì)說明:

  1. 創(chuàng)建 GetRequest 對(duì)象: 使用 GetRequest 對(duì)象指定索引庫名稱為 “hotel”,文檔 ID 為 “61083”。

  2. 發(fā)送請(qǐng)求,獲取結(jié)果: 使用 client.get(request, RequestOptions.DEFAULT) 發(fā)送請(qǐng)求,獲取包含文檔信息的 GetResponse 對(duì)象。

  3. 解析結(jié)果: 通過 response.getSourceAsString() 獲取文檔內(nèi)容的 JSON 字符串表示。

  4. 將字符串解析為 HotelDoc 對(duì)象: 使用 JSON.parseObject(json, HotelDoc.class) 將獲取的 JSON 字符串解析為 HotelDoc 對(duì)象。

這個(gè)測試方法演示了如何通過 Java RestClient 獲取 Elasticsearch 索引庫中指定文檔的信息。

3.3 更新文檔

更新文檔的測試方法的代碼如下:

@Test
void testUpdateDocument() throws IOException {
    // 1. 獲取 Request 對(duì)象
    UpdateRequest request = new UpdateRequest("hotel", "61083");

    // 2. 準(zhǔn)備參數(shù)
    request.doc(
            "price", 1000,
            "score", 50
    );

    // 3. 發(fā)起請(qǐng)求
    client.update(request, RequestOptions.DEFAULT);
}

對(duì)該方法的詳細(xì)說明:

  1. 獲取 UpdateRequest 對(duì)象: 使用 UpdateRequest 對(duì)象指定索引庫名稱為 “hotel”,文檔 ID 為 “61083”。

  2. 準(zhǔn)備參數(shù): 使用 request.doc(...) 方法準(zhǔn)備需要更新的字段及其對(duì)應(yīng)的新值。在這個(gè)例子中,更新了 “price” 字段為 1000,“score” 字段為 50。

  3. 發(fā)起請(qǐng)求: 使用 client.update(request, RequestOptions.DEFAULT) 發(fā)送更新請(qǐng)求。

這個(gè)測試方法演示了如何通過 Java RestClient 更新 Elasticsearch 索引庫中的指定文檔。

3.4 刪除文檔

刪除指定文檔的單元測試方法的代碼如下:

@Test
 void testDeleteDocument() throws IOException {
     // 1. 獲取 Request 對(duì)象
     DeleteRequest request = new DeleteRequest("hotel", "61083");

     // 2. 發(fā)起請(qǐng)求
     client.delete(request, RequestOptions.DEFAULT);
 }

對(duì)該方法的詳細(xì)說明:

  1. 獲取 DeleteRequest 對(duì)象: 使用 DeleteRequest 對(duì)象指定索引庫名稱為 “hotel”,文檔 ID 為 “61083”。

  2. 發(fā)起請(qǐng)求: 使用 client.delete(request, RequestOptions.DEFAULT) 發(fā)送刪除請(qǐng)求。

這個(gè)測試方法演示了如何通過 Java RestClient 刪除 Elasticsearch 索引庫中的指定文檔。

3.5 批量導(dǎo)入文檔

在實(shí)際開發(fā)中,我們不可能像上面那樣一條數(shù)據(jù)一條數(shù)據(jù)的導(dǎo)入到文檔中,而是需要批量的查詢數(shù)據(jù)庫,然后將結(jié)果集批量的導(dǎo)入到文檔中,導(dǎo)入批量數(shù)據(jù)到文檔的測試方法如下:

@Test
void testBulkRequest() throws IOException {
    // 批量查詢酒店數(shù)據(jù)
    List<Hotel> hotels = hotelService.list();

    // 1. 創(chuàng)建 BulkRequest
    BulkRequest request = new BulkRequest();

    // 轉(zhuǎn)換為文檔類型 HotelDoc
    for (Hotel hotel : hotels) {
        HotelDoc hotelDoc = new HotelDoc(hotel);
        // 2. 準(zhǔn)備參數(shù),添加多個(gè)新增的 Request
        request.add(new IndexRequest("hotel")
                .id(hotel.getId().toString())
                .source(JSON.toJSONString(hotelDoc), XContentType.JSON));
    }

    // 3. 發(fā)起請(qǐng)求
    client.bulk(request, RequestOptions.DEFAULT);
}

對(duì)上述代碼的說明:

  1. 批量查詢酒店數(shù)據(jù): 使用 hotelService.list() 批量獲取酒店數(shù)據(jù)。

  2. 創(chuàng)建 BulkRequest 對(duì)象: 使用 BulkRequest 對(duì)象準(zhǔn)備批量請(qǐng)求。

  3. 循環(huán)添加請(qǐng)求: 遍歷酒店數(shù)據(jù)列表,將每個(gè)酒店數(shù)據(jù)轉(zhuǎn)換為 HotelDoc 類型,并添加到 BulkRequest 中。

  4. 發(fā)起請(qǐng)求: 使用 client.bulk(request, RequestOptions.DEFAULT) 發(fā)送批量請(qǐng)求。

這個(gè)測試方法演示了如何通過 Java RestClient 批量導(dǎo)入 Elasticsearch 索引庫中的文檔。批量導(dǎo)入通常能夠提高效率,特別是在處理大量數(shù)據(jù)時(shí)。文章來源地址http://www.zghlxwxcb.cn/news/detail-714095.html

到了這里,關(guān)于【ElasticSearch】基于 Java 客戶端 RestClient 實(shí)現(xiàn)對(duì) ElasticSearch 索引庫、文檔的增刪改查操作,以及文檔的批量導(dǎo)入的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Java網(wǎng)絡(luò)編程】基于UDP-Socket 實(shí)現(xiàn)客戶端、服務(wù)器通信

    【Java網(wǎng)絡(luò)編程】基于UDP-Socket 實(shí)現(xiàn)客戶端、服務(wù)器通信

    ? 哈嘍,大家好~我是你們的老朋友: 保護(hù)小周??? 本期為大家?guī)淼氖蔷W(wǎng)絡(luò)編程的 UDP Socket 套接字,基于 UDP協(xié)議的 Socket 實(shí)現(xiàn)客戶端服務(wù)器通信 ,Socket 套接字可以理解為是,傳輸層給應(yīng)用層提供的一組 API,如此程序,確定不來看看嘛~~ 本期收錄于博主的專欄 : JavaEE_保

    2024年02月02日
    瀏覽(111)
  • 干貨 | Elasticsearch Java 客戶端演進(jìn)歷史和選型指南

    干貨 | Elasticsearch Java 客戶端演進(jìn)歷史和選型指南

    Elasticsearch 官方提供了很多版本的 Java 客戶端,包含但不限于: Transport 客戶端 Java REST 客戶端 Low Level REST 客戶端 High Level REST 客戶端 Java API 客戶端 非官方的 Java 客戶端,包含但不限于: Jest 客戶端 BBoss 客戶端 Spring Data Elasticsearch 客戶端 ...... 寫出來的就接近十款客戶端! El

    2023年04月11日
    瀏覽(23)
  • ElasticSearch-學(xué)習(xí)筆記04【Java客戶端操作索引庫】

    ElasticSearch-學(xué)習(xí)筆記04【Java客戶端操作索引庫】

    Java后端-學(xué)習(xí)路線-筆記匯總表【黑馬程序員】 ElasticSearch-學(xué)習(xí)筆記01【ElasticSearch基本介紹】 【day01】 ElasticSearch-學(xué)習(xí)筆記02【ElasticSearch索引庫維護(hù)】 ElasticSearch-學(xué)習(xí)筆記03【ElasticSearch集群】 ElasticSearch-學(xué)習(xí)筆記04【Java客戶端操作索引庫】 【day02】 ElasticSearch-學(xué)習(xí)筆記05【Spri

    2023年04月09日
    瀏覽(35)
  • Elasticsearch Java客戶端和Spring data elasticsearch-Elasticsearch文章三

    Elasticsearch Java客戶端和Spring data elasticsearch-Elasticsearch文章三

    https://www.elastic.co/cn/ 整合springboot看上一篇文章 一定要對(duì)應(yīng)好版本,Elasticsearch 的不同版本變化是真大, https://docs.spring.io/spring-data/elasticsearch/docs/4.4.10/reference/html/ Springboot: 2.7.10 spring-data-elasticsearch: 4.4.10 spring-boot-starter-data-elasticsearch: 2.7.10 elasticsearch-java: 7.17.9 https://github.com/

    2024年02月14日
    瀏覽(44)
  • windows環(huán)境安裝elasticsearch+kibana并完成JAVA客戶端查詢

    windows環(huán)境安裝elasticsearch+kibana并完成JAVA客戶端查詢

    elasticsearch 官網(wǎng)下載比較慢,有時(shí)還打不開,可以通過https://elasticsearch.cn/download/下載,先找到對(duì)應(yīng)的版本,最好使用迅雷下載,秒下的,我的下載速度可以達(dá)到40M/S 解壓后點(diǎn)擊 elasticsearch-7.10.0binelasticsearch.bat 運(yùn)行成功后,輸入http://120.0.0.1:9200,可以訪問說明ES啟動(dòng)成功 點(diǎn)擊

    2024年02月14日
    瀏覽(27)
  • Elasticsearch8.x版本Java客戶端Elasticsearch Java API Client中常用API練習(xí)

    在Es7.15版本之后,es官方將它的高級(jí)客戶端RestHighLevelClient標(biāo)記為棄用狀態(tài)。同時(shí)推出了全新的java API客戶端Elasticsearch Java API Client,該客戶端也將在Elasticsearch8.0及以后版本中成為官方推薦使用的客戶端。 Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有

    2024年04月11日
    瀏覽(25)
  • [elastic 8.x]java客戶端連接elasticsearch與操作索引與文檔

    為了方便演示,我關(guān)閉了elasticsearch的安全驗(yàn)證,帶安全驗(yàn)證的初始化方式將在最后專門介紹 其中,HotelDoc是一個(gè)實(shí)體類 帶安全驗(yàn)證的連接有點(diǎn)復(fù)雜,將下列代碼中CA證書的位置改為實(shí)際所在的位置就行了。 password為elastic的密碼,可以在我的另一篇文章中查看密碼的重置方式

    2024年04月11日
    瀏覽(28)
  • Elasticsearch:在 Java 客戶端應(yīng)用中管理索引 - Elastic Stack 8.x

    管理索引是客戶端應(yīng)用常用的一些動(dòng)作,比如我們創(chuàng)建,刪除,打開 及關(guān)閉索引等操作。在今天的文章中,我將描述如何在 Java 客戶端應(yīng)用中對(duì)索引進(jìn)行管理。 我們需要閱讀之前的文章 “Elasticsearch:在 Java 客戶端中使用 truststore 來創(chuàng)建 HTTPS 連接”。在那篇文章中,我們?cè)?/p>

    2023年04月09日
    瀏覽(22)
  • Java客戶端調(diào)用elasticsearch進(jìn)行深度分頁查詢 (search_after)

    Java客戶端調(diào)用elasticsearch進(jìn)行深度分頁查詢 (search_after)

    前言 這是我在這個(gè)網(wǎng)站整理的筆記,有錯(cuò)誤的地方請(qǐng)指出,關(guān)注我,接下來還會(huì)持續(xù)更新。 作者:神的孩子都在歌唱 具體的Search_after解釋,可以看我這篇文章 elasticsearch 深度分頁查詢 Search_after(圖文教程) 參考:https://blog.csdn.net/qq_44056652/article/details/126341810 作者:神的孩子

    2024年03月22日
    瀏覽(16)
  • 基于grpc-java開發(fā)的普通工程在k8s內(nèi)部署多實(shí)例,如何實(shí)現(xiàn)客戶端流量的負(fù)載均衡

    基于grpc-java開發(fā)的普通工程在k8s內(nèi)部署多實(shí)例,如何實(shí)現(xiàn)客戶端流量的負(fù)載均衡

    本文主要討論通過grpc-java開發(fā)的普通的java grpc工程,以多實(shí)例的方式部署在容器編排平臺(tái)kubernetes(以下簡稱k8s)上,如何能夠?qū)崿F(xiàn)讓同樣部署在k8s 集群內(nèi)的客戶端請(qǐng)求流量均衡的分發(fā)到多個(gè)grpc應(yīng)用部署實(shí)例上去。 grpc服務(wù)端程序在k8s內(nèi)部署的多個(gè)實(shí)例通過headless service暴露服

    2024年01月17日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包