模板網(wǎng)站建設(shè)報(bào)價(jià)網(wǎng)絡(luò)營(yíng)銷比較常用的營(yíng)銷模式
文章目錄
- 前言
- 一、對(duì) Java RestClient 的認(rèn)識(shí)
- 1.1 什么是 RestClient
- 1.2 RestClient 核心類:RestHighLevelClient
- 二、使用 Java RestClient 操作索引庫(kù)
- 2.1 根據(jù)數(shù)據(jù)庫(kù)表編寫創(chuàng)建 ES 索引的 DSL 語(yǔ)句
- 2.2 初始化 Java RestClient
- 2.2.1 在 Spring Boot 項(xiàng)目中引入 `RestHighLevelClient` 的依賴
- 2.2.2 編寫 HotelIndexTests 單元測(cè)試類,完成 RestHighLevelClient 的初始化
- 2.3 創(chuàng)建索引庫(kù)
- 2.4 刪除索引庫(kù)
- 2.5 判斷索引庫(kù)是否存在
- 三、使用 Java RestClient 實(shí)現(xiàn)對(duì)文檔的增刪改查
- 3.1 新增文檔
- 3.2 獲取文檔
- 3.3 更新文檔
- 3.4 刪除文檔
- 3.5 批量導(dǎo)入文檔
前言
ElasticSearch 官方提供了各種不同語(yǔ)言的客戶端,用來(lái)操作 ES。這些客戶端的本質(zhì)就是組裝 DSL 語(yǔ)句,通過(guò) HTTP 請(qǐng)求發(fā)送給 ES 服務(wù)器。
官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html。
在本文中,我們將著重介紹 ElasticSearch Java 客戶端中的 RestClient,并演示如何使用它實(shí)現(xiàn)對(duì)索引庫(kù)和文檔的各種操作。
一、對(duì) Java RestClient 的認(rèn)識(shí)
1.1 什么是 RestClient
RestClient 是 ElasticSearch 提供的用于與 ElasticSearch 集群進(jìn)行通信的 Java 客戶端。它提供了一種簡(jiǎn)單而靈活的方式來(lái)執(zhí)行 REST 請(qǐng)求,并處理響應(yīng)。通過(guò) RestClient,我們可以輕松地在 Java 中操作 ElasticSearch。
在 ES 官方文檔中看到 Java 的 RestClient 分為 High level REST client
和 Low level REST client
:
它們之間的區(qū)別:
-
High Level REST Client:
- 面向?qū)ο?#xff1a;提供了更加面向?qū)ο蟮腁PI,簡(jiǎn)化了復(fù)雜的操作,使用起來(lái)更加方便。
- 使用場(chǎng)景:適用于絕大多數(shù)的操作,特別是對(duì)于復(fù)雜的操作,比如查詢、索引、更新等。
-
Low Level REST Client:
- 更接近 HTTP 層:提供的是與 Elasticsearch REST API 一一對(duì)應(yīng)的方法,更加靈活,適用于特定場(chǎng)景的定制化需求。
- 使用場(chǎ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):
-
面向?qū)ο蟮牟僮?/strong>:RestHighLevelClient 提供了更加面向?qū)ο蟮?API,使得 Elasticsearch 操作更加符合 Java 開(kāi)發(fā)的習(xí)慣,易于理解和使用。
-
內(nèi)置序列化和反序列化:RestHighLevelClient 內(nèi)置了 Jackson 庫(kù),可以自動(dòng)序列化和反序列化 Elasticsearch 的請(qǐng)求和響應(yīng),無(wú)需手動(dòng)處理 JSON 數(shù)據(jù)。
-
復(fù)雜查詢支持:支持復(fù)雜的 Elasticsearch 查詢操作,如布爾查詢、范圍查詢、聚合查詢等。
-
錯(cuò)誤處理:提供了異常處理機(jī)制,能夠更好地捕獲和處理 Elasticsearch 操作中的錯(cuò)誤。
-
并發(fā)性:RestHighLevelClient 可以處理多個(gè)并發(fā)請(qǐng)求,是多線程安全的。
常用操作和方法:
以下是 RestHighLevelClient 類的一些常用操作和方法,通過(guò)這些方法可以實(shí)現(xiàn)對(duì) Elasticsearch 的索引庫(kù)和文檔的各種操作:
操作 | 方法 | 描述 |
---|---|---|
索引文檔 | 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 操作索引庫(kù)
2.1 根據(jù)數(shù)據(jù)庫(kù)表編寫創(chuàng)建 ES 索引的 DSL 語(yǔ)句
當(dāng)需要將已有的數(shù)據(jù)庫(kù)數(shù)據(jù)導(dǎo)入到 Elasticsearch 索引中時(shí),首先需要定義好 Elasticsearch 索引的 mapping 結(jié)構(gòu),這樣 Elasticsearch 才能正確解析和存儲(chǔ)數(shù)據(jù)。
在這個(gè)例子中,我們有一個(gè)名為 hotel
的數(shù)據(jù)庫(kù)表,它有各種不同類型的字段,包括文本、數(shù)字、地理坐標(biāo)等。讓我們逐步解釋如何根據(jù)數(shù)據(jù)庫(kù)表的結(jié)構(gòu)編寫創(chuàng)建 Elasticsearch 索引的 DSL(Domain Specific Language)語(yǔ)句。
- 數(shù)據(jù)庫(kù)表結(jié)構(gòu)分析
首先,讓我們來(lái)看一下 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
:長(zhǎng)整型(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íng)業(yè)信息(可為空)latitude
:文本字符串,用于存儲(chǔ)緯度坐標(biāo)longitude
:文本字符串,用于存儲(chǔ)經(jīng)度坐標(biāo)pic
:文本字符串,用于存儲(chǔ)圖片路徑(可為空)
- 創(chuàng)建 Elasticsearch 索引的 DSL
現(xiàn)在,讓我們將上述數(shù)據(jù)庫(kù)表的結(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"}}}
}
重要說(shuō)明:
- 地理坐標(biāo) (
location
) 字段:
在 MySQL 數(shù)據(jù)庫(kù)表中,地理坐標(biāo)是使用 latitude
和 longitude
兩個(gè)字段表示的。但在 Elasticsearch 中,我們使用 geo_point
類型來(lái)表示地理坐標(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)"
。
- 字段拷貝:
字段拷貝的目的是在搜索時(shí),同時(shí)匹配多個(gè)字段。我們使用 copy_to
屬性將當(dāng)前字段拷貝到指定字段。這樣,在搜索時(shí),可以同時(shí)匹配 name
、brand
和 business
字段。
示例:
"all": {"type": "text","analyzer": "ik_max_word"
},
"brand": {"type": "keyword","copy_to": "all"
}
- 映射規(guī)則總結(jié)
Elasticsearch 對(duì)不同類型的字段有不同的映射規(guī)則,以下是常見(jiàn)類型的映射規(guī)則:
- 字符串 (
text
和keyword
):text
用于全文搜索,支持分詞;keyword
用于精確匹配,不分詞。 - 整數(shù) (
integer
): 用于存儲(chǔ)整數(shù)。 - 長(zhǎng)整型 (
long
): 用于存儲(chǔ)長(zhǎng)整數(shù)。 - 浮點(diǎn)數(shù) (
float
): 用于存儲(chǔ)浮點(diǎn)數(shù)。 - 地理坐標(biāo) (
geo_point
): 用于存儲(chǔ)地理坐標(biāo)。 - 日期 (
date
): 用于存儲(chǔ)日期時(shí)間。
通過(guò)正確定義索引的映射規(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
的:
其原因是 Spring Boot 已經(jīng)自動(dòng)為我們管理了一些依賴,其中就包括了elasticsearch
,其版本就是 7.6.2
的。
因此我們需要做的就是在 pom.xml
覆蓋這個(gè)配置,即在 properties
中指定版本為 7.12.1
:
再次刷新 Maven,就能夠發(fā)現(xiàn)所有組件的版本都是 7.12.1
了:
2.2.2 編寫 HotelIndexTests 單元測(cè)試類,完成 RestHighLevelClient 的初始化
@SpringBootTest
class HotelIndexTests {private RestHighLevelClient client;@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.248.128:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}/*** 測(cè)試初始化客戶端*/@Testvoid testInit() {System.out.println(client);}
}
對(duì)上述代碼的說(shuō)明:
- 在上述代碼中,通過(guò)
RestClient.builder
構(gòu)建了RestHighLevelClient
實(shí)例,并指定了 ElasticSearch 服務(wù)器的地址為http://192.168.248.128:9200
。這是一個(gè)簡(jiǎn)單的單元測(cè)試,用于驗(yàn)證客戶端的初始化是否成功。
- 在
@BeforeEach
注解的方法中,我們創(chuàng)建了RestHighLevelClient
的實(shí)例,而在@AfterEach
注解的方法中,我們關(guān)閉了客戶端。這是為了保證測(cè)試用例執(zhí)行前后,客戶端都能夠正確地被初始化和關(guān)閉。
- 在測(cè)試方法
testInit
中,我們簡(jiǎn)單地打印了客戶端對(duì)象,以驗(yàn)證其初始化是否成功。
在接下來(lái)的內(nèi)容中,我們將繼續(xù)使用編寫單元測(cè)試方法,執(zhí)行一系列對(duì) ElasticSearch 索引庫(kù)和文檔的操作。
2.3 創(chuàng)建索引庫(kù)
創(chuàng)建 hotel
索引庫(kù)會(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)建索引庫(kù)的單元測(cè)試方:
/*** 創(chuàng)建索引庫(kù)** @throws IOException 拋出異常*/@Testvoid testCreateHotelIndex() throws IOException {// 1. 創(chuàng)建 Request 對(duì)象CreateIndexRequest request = new CreateIndexRequest("hotel");// 2. 準(zhǔn)備請(qǐng)求參數(shù):DSL 語(yǔ)句request.source(MAPPING_TEMPLATE, XContentType.JSON);// 3. 發(fā)起請(qǐng)求client.indices().create(request, RequestOptions.DEFAULT);}
對(duì)上述代碼的說(shuō)明:
- 創(chuàng)建
CreateIndexRequest
對(duì)象,指定索引庫(kù)的名稱為"hotel"
。 - 準(zhǔn)備請(qǐng)求參數(shù),即 DSL 語(yǔ)句,使用
MAPPING_TEMPLATE
常量。 - 發(fā)起創(chuàng)建索引庫(kù)的請(qǐng)求,通過(guò)
client.indices().create(request, RequestOptions.DEFAULT)
執(zhí)行。
這樣,我們就完成了通過(guò) Java RestClient 創(chuàng)建 ElasticSearch 索引庫(kù)的操作。在實(shí)際應(yīng)用中,創(chuàng)建索引庫(kù)是一個(gè)初始化工作,通常在應(yīng)用啟動(dòng)時(shí)執(zhí)行一次即可。
2.4 刪除索引庫(kù)
以下是使用 Java RestClient 刪除名為 “hotel” 的索引庫(kù)的單元測(cè)試方法:
/*** 刪除索引庫(kù)* @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ì)上述代碼的說(shuō)明:
- 創(chuàng)建
DeleteIndexRequest
對(duì)象,指定要?jiǎng)h除的索引庫(kù)名稱為 “hotel”。 - 發(fā)起刪除索引庫(kù)的請(qǐng)求,通過(guò)
client.indices().delete(request, RequestOptions.DEFAULT)
執(zhí)行。
這個(gè)方法主要用于清理測(cè)試環(huán)境或者在應(yīng)用退出時(shí)執(zhí)行,以確保數(shù)據(jù)的整潔和安全。
刪除索引庫(kù)的操作需要謹(jǐn)慎執(zhí)行,因?yàn)樗鼤?huì)將整個(gè)索引庫(kù)以及其中的所有文檔都刪除,且無(wú)法恢復(fù)。在實(shí)際應(yīng)用中,通常會(huì)設(shè)置一些安全機(jī)制來(lái)避免誤操作。
2.5 判斷索引庫(kù)是否存在
在 Elasticsearch 中,我們可以通過(guò) Java RestClient 來(lái)判斷指定的索引庫(kù)是否存在。以下是一個(gè)示例代碼:
@Test
void testExistsHotelIndex() throws IOException {// 1. 創(chuàng)建 GetIndexRequest 對(duì)象,指定要判斷是否存在的索引庫(kù)名稱為 "hotel"GetIndexRequest request = new GetIndexRequest("hotel");// 2. 發(fā)起請(qǐng)求,執(zhí)行判斷索引庫(kù)是否存在的操作boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 3. 打印判斷結(jié)果System.out.println(exists ? "索引庫(kù)存在" : "索引庫(kù)不存在");
}
在這個(gè)方法中,首先創(chuàng)建了一個(gè) GetIndexRequest
對(duì)象,指定了要判斷是否存在的索引庫(kù)名稱為 “hotel”。然后,通過(guò) client.indices().exists(request, RequestOptions.DEFAULT)
發(fā)起請(qǐng)求,執(zhí)行判斷索引庫(kù)是否存在的操作。最后,根據(jù)返回的布爾值,輸出相應(yīng)的提示信息。
這個(gè)方法通常用于在進(jìn)行其他操作之前,先判斷索引庫(kù)是否存在,以確保我們不會(huì)對(duì)不存在的索引庫(kù)執(zhí)行其他操作。
三、使用 Java RestClient 實(shí)現(xiàn)對(duì)文檔的增刪改查
3.1 新增文檔
在新增文檔之前,首先需要從數(shù)據(jù)庫(kù)中去查詢一條記錄,然后再將查詢到的記錄保存到 ES 文檔中。例如,現(xiàn)在有一條 id=61083
的酒店數(shù)據(jù),我們需要把它查詢出來(lái),然后添加到文檔中:
首先同樣需要?jiǎng)?chuàng)建一個(gè)測(cè)試類HotelDocumentTests
,并完成 RestHighLevelClient
的初始化。然后新增文檔的測(cè)試代碼如下:
@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ì)上述代碼的說(shuō)明:
-
根據(jù) ID 查詢酒店數(shù)據(jù): 使用
hotelService.getById(61083L)
方法從數(shù)據(jù)庫(kù)中根據(jù)酒店 ID(這里是61083L
)查詢酒店數(shù)據(jù)并封裝到Hotel
對(duì)象中。 -
轉(zhuǎn)換為文檔類型: 將查詢到的
Hotel
類型轉(zhuǎn)換為HotelDoc
文檔類型,因?yàn)閿?shù)據(jù)庫(kù)和文檔中表示經(jīng)緯度的方式不同。 -
準(zhǔn)備
IndexRequest
對(duì)象: 創(chuàng)建IndexRequest
對(duì)象,指定索引庫(kù)名稱為 “hotel”,并設(shè)置文檔 ID 為酒店的 ID(使用hotel.getId().toString()
獲取 ID 的字符串表示)。 -
準(zhǔn)備 JSON 文檔: 將
HotelDoc
對(duì)象轉(zhuǎn)換為 JSON 格式的字符串,使用JSON.toJSONString(hotelDoc)
實(shí)現(xiàn)轉(zhuǎn)換。 -
發(fā)送請(qǐng)求: 使用
client.index(request, RequestOptions.DEFAULT)
發(fā)送請(qǐng)求,將準(zhǔn)備好的文檔添加到索引庫(kù)中。
這個(gè)測(cè)試方法演示了如何通過(guò) Java RestClient 向 Elasticsearch 索引庫(kù)中新增文檔。
3.2 獲取文檔
獲取指定文檔的測(cè)試方法的代碼如下:
@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ì)說(shuō)明:
-
創(chuàng)建
GetRequest
對(duì)象: 使用GetRequest
對(duì)象指定索引庫(kù)名稱為 “hotel”,文檔 ID 為 “61083”。 -
發(fā)送請(qǐng)求,獲取結(jié)果: 使用
client.get(request, RequestOptions.DEFAULT)
發(fā)送請(qǐng)求,獲取包含文檔信息的GetResponse
對(duì)象。 -
解析結(jié)果: 通過(guò)
response.getSourceAsString()
獲取文檔內(nèi)容的 JSON 字符串表示。 -
將字符串解析為
HotelDoc
對(duì)象: 使用JSON.parseObject(json, HotelDoc.class)
將獲取的 JSON 字符串解析為HotelDoc
對(duì)象。
這個(gè)測(cè)試方法演示了如何通過(guò) Java RestClient 獲取 Elasticsearch 索引庫(kù)中指定文檔的信息。
3.3 更新文檔
更新文檔的測(cè)試方法的代碼如下:
@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ì)說(shuō)明:
-
獲取
UpdateRequest
對(duì)象: 使用UpdateRequest
對(duì)象指定索引庫(kù)名稱為 “hotel”,文檔 ID 為 “61083”。 -
準(zhǔn)備參數(shù): 使用
request.doc(...)
方法準(zhǔn)備需要更新的字段及其對(duì)應(yīng)的新值。在這個(gè)例子中,更新了 “price” 字段為 1000,“score” 字段為 50。 -
發(fā)起請(qǐng)求: 使用
client.update(request, RequestOptions.DEFAULT)
發(fā)送更新請(qǐng)求。
這個(gè)測(cè)試方法演示了如何通過(guò) Java RestClient 更新 Elasticsearch 索引庫(kù)中的指定文檔。
3.4 刪除文檔
刪除指定文檔的單元測(cè)試方法的代碼如下:
@Testvoid testDeleteDocument() throws IOException {// 1. 獲取 Request 對(duì)象DeleteRequest request = new DeleteRequest("hotel", "61083");// 2. 發(fā)起請(qǐng)求client.delete(request, RequestOptions.DEFAULT);}
對(duì)該方法的詳細(xì)說(shuō)明:
-
獲取
DeleteRequest
對(duì)象: 使用DeleteRequest
對(duì)象指定索引庫(kù)名稱為 “hotel”,文檔 ID 為 “61083”。 -
發(fā)起請(qǐng)求: 使用
client.delete(request, RequestOptions.DEFAULT)
發(fā)送刪除請(qǐng)求。
這個(gè)測(cè)試方法演示了如何通過(guò) Java RestClient 刪除 Elasticsearch 索引庫(kù)中的指定文檔。
3.5 批量導(dǎo)入文檔
在實(shí)際開(kāi)發(fā)中,我們不可能像上面那樣一條數(shù)據(jù)一條數(shù)據(jù)的導(dǎo)入到文檔中,而是需要批量的查詢數(shù)據(jù)庫(kù),然后將結(jié)果集批量的導(dǎo)入到文檔中,導(dǎo)入批量數(shù)據(jù)到文檔的測(cè)試方法如下:
@Test
void testBulkRequest() throws IOException {// 批量查詢酒店數(shù)據(jù)List<Hotel> hotels = hotelService.list();// 1. 創(chuàng)建 BulkRequestBulkRequest request = new BulkRequest();// 轉(zhuǎn)換為文檔類型 HotelDocfor (Hotel hotel : hotels) {HotelDoc hotelDoc = new HotelDoc(hotel);// 2. 準(zhǔn)備參數(shù),添加多個(gè)新增的 Requestrequest.add(new IndexRequest("hotel").id(hotel.getId().toString()).source(JSON.toJSONString(hotelDoc), XContentType.JSON));}// 3. 發(fā)起請(qǐng)求client.bulk(request, RequestOptions.DEFAULT);
}
對(duì)上述代碼的說(shuō)明:
-
批量查詢酒店數(shù)據(jù): 使用
hotelService.list()
批量獲取酒店數(shù)據(jù)。 -
創(chuàng)建
BulkRequest
對(duì)象: 使用BulkRequest
對(duì)象準(zhǔn)備批量請(qǐng)求。 -
循環(huán)添加請(qǐng)求: 遍歷酒店數(shù)據(jù)列表,將每個(gè)酒店數(shù)據(jù)轉(zhuǎn)換為
HotelDoc
類型,并添加到BulkRequest
中。 -
發(fā)起請(qǐng)求: 使用
client.bulk(request, RequestOptions.DEFAULT)
發(fā)送批量請(qǐng)求。
這個(gè)測(cè)試方法演示了如何通過(guò) Java RestClient 批量導(dǎo)入 Elasticsearch 索引庫(kù)中的文檔。批量導(dǎo)入通常能夠提高效率,特別是在處理大量數(shù)據(jù)時(shí)。