前言
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 client
和 Low level REST client
:
它們之間的區(qū)別:
-
High Level REST Client:
- 面向?qū)ο螅禾峁┝烁用嫦驅(qū)ο蟮腁PI,簡化了復(fù)雜的操作,使用起來更加方便。
- 使用場景:適用于絕大多數(shù)的操作,特別是對(duì)于復(fù)雜的操作,比如查詢、索引、更新等。
-
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):
-
面向?qū)ο蟮牟僮?/strong>:RestHighLevelClient 提供了更加面向?qū)ο蟮?API,使得 Elasticsearch 操作更加符合 Java 開發(fā)的習(xí)慣,易于理解和使用。
-
內(nèi)置序列化和反序列化:RestHighLevelClient 內(nèi)置了 Jackson 庫,可以自動(dòng)序列化和反序列化 Elasticsearch 的請(qǐng)求和響應(yīng),無需手動(dòng)處理 JSON 數(shù)據(jù)。
-
復(fù)雜查詢支持:支持復(fù)雜的 Elasticsearch 查詢操作,如布爾查詢、范圍查詢、聚合查詢等。
-
錯(cuò)誤處理:提供了異常處理機(jī)制,能夠更好地捕獲和處理 Elasticsearch 操作中的錯(cuò)誤。
-
并發(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)語句。
- 數(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ǔ)圖片路徑(可為空)
- 創(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"
}
}
}
}
重要說明:
- 地理坐標(biāo) (
location
) 字段:
在 MySQL 數(shù)據(jù)庫表中,地理坐標(biāo)是使用 latitude
和 longitude
兩個(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)"
。
- 字段拷貝:
字段拷貝的目的是在搜索時(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ī)則,以下是常見類型的映射規(guī)則:
-
字符串 (
text
和keyword
):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
的:
其原因是 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 單元測試類,完成 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ì)上述代碼的說明:
- 創(chuàng)建
CreateIndexRequest
對(duì)象,指定索引庫的名稱為"hotel"
。 - 準(zhǔn)備請(qǐng)求參數(shù),即 DSL 語句,使用
MAPPING_TEMPLATE
常量。 - 發(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ì)上述代碼的說明:
- 創(chuàng)建
DeleteIndexRequest
對(duì)象,指定要?jiǎng)h除的索引庫名稱為 “hotel”。 - 發(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ù),我們需要把它查詢出來,然后添加到文檔中:
首先同樣需要?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ì)上述代碼的說明:
-
根據(jù) ID 查詢酒店數(shù)據(jù): 使用
hotelService.getById(61083L)
方法從數(shù)據(jù)庫中根據(jù)酒店 ID(這里是61083L
)查詢酒店數(shù)據(jù)并封裝到Hotel
對(duì)象中。 -
轉(zhuǎn)換為文檔類型: 將查詢到的
Hotel
類型轉(zhuǎn)換為HotelDoc
文檔類型,因?yàn)閿?shù)據(jù)庫和文檔中表示經(jīng)緯度的方式不同。 -
準(zhǔn)備
IndexRequest
對(duì)象: 創(chuàng)建IndexRequest
對(duì)象,指定索引庫名稱為 “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)備好的文檔添加到索引庫中。
這個(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ì)說明:
-
創(chuàng)建
GetRequest
對(duì)象: 使用GetRequest
對(duì)象指定索引庫名稱為 “hotel”,文檔 ID 為 “61083”。 -
發(fā)送請(qǐng)求,獲取結(jié)果: 使用
client.get(request, RequestOptions.DEFAULT)
發(fā)送請(qǐng)求,獲取包含文檔信息的GetResponse
對(duì)象。 -
解析結(jié)果: 通過
response.getSourceAsString()
獲取文檔內(nèi)容的 JSON 字符串表示。 -
將字符串解析為
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ì)說明:
-
獲取
UpdateRequest
對(duì)象: 使用UpdateRequest
對(duì)象指定索引庫名稱為 “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è)測試方法演示了如何通過 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ì)說明:
-
獲取
DeleteRequest
對(duì)象: 使用DeleteRequest
對(duì)象指定索引庫名稱為 “hotel”,文檔 ID 為 “61083”。 -
發(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ì)上述代碼的說明:
-
批量查詢酒店數(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)求。文章來源:http://www.zghlxwxcb.cn/news/detail-714095.html
這個(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)!