文章目錄
- RestAPI
- 初始化RestClient
- 創建索引庫
- 刪除索引庫
- 判斷索引庫是否存在
- 總結
- RestClient操作文檔
- 增加文檔數據
- 查詢文檔
- 刪除文檔
- 修改文檔
- 批量導入文檔
- 小結
RestAPI
ES官方提供了各種不同語言的客戶端,用來操作ES。這些客戶端的本質就是組裝DSL語句,通過http請求發送給ES。官方文檔地址:https://www.elastic.co/guide/en/elasticsearch/client/index.html
其中的Java Rest Client又包括兩種:
- Java Low Level Rest Client
- Java High Level Rest Client
我這邊以
Java High Level Rest Client
為例
初始化RestClient
在elasticsearch提供的API中,與elasticsearch一切交互都封裝在一個名為RestHighLevelClient的類中,必須先完成這個對象的初始化,建立與elasticsearch的連接。
分為三步:
在這里插入代碼片
1)引入es的RestHighLevelClient依賴:
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
2)因為SpringBoot默認的ES版本是7.6.2,所以我們需要覆蓋默認的ES版本:
<properties><java.version>1.8</java.version><elasticsearch.version>7.12.1</elasticsearch.version>
</properties>
3)初始化RestHighLevelClient:
@Value("${es.url}")private String esUrl;@Beanpublic RestHighLevelClient restHighLevelClient() {return new RestHighLevelClient(RestClient.builder(HttpHost.create(esUrl)));}
創建索引庫
代碼分為三步:
- 1)創建Request對象。因為是創建索引庫的操作,因此Request是CreateIndexRequest。
- 2)添加請求參數,其實就是DSL的JSON參數部分。因為json字符串很長,這里是定義了靜態字符串常量MAPPING_TEMPLATE,讓代碼看起來更加優雅。
- 3)發送請求,client.indices()方法的返回值是IndicesClient類型,封裝了所有與索引庫操作有關的方法。
public static final String MAPPING_TEMPLATE = "{\n" +" \"mappings\":{\n" +" \"properties\":{\n" +" \"msgId\":{\n" +" \"type\":\"keyword\",\n" +" \"index\":\"true\"\n" +" },\n" +" \"money\":{\n" +" \"type\":\"double\"\n" +" },\n" +" \"type\":{\n" +" \"type\":\"integer\",\n" +" \"index\":\"true\"\n" +" },\n" +" \"fromUserId\":{\n" +" \"type\":\"integer\",\n" +" \"index\":\"true\"\n" +" },\n" +" \"convType\":{\n" +" \"type\":\"integer\",\n" +" \"index\":\"true\"\n" +" },\n" +" \"convId\":{\n" +" \"type\":\"integer\",\n" +" \"index\":\"true\"\n" +" },\n" +" \"msgType\":{\n" +" \"type\":\"integer\",\n" +" \"index\":\"true\"\n" +" },\n" +" \"msg_body\":{\n" +" \"type\":\"keyword\"\n" +" },\n" +" \"msgTime\":{\n" +" \"type\":\"long\"\n" +" },\n" +" \"subMsgType\":{\n" +" \"type\":\"keyword\",\n" +" \"index\":\"true\"\n" +" }\n" +" }\n" +" }\n" +"}" ;@BeforeEachvoid setUp() {this.client = new RestHighLevelClient(RestClient.builder(HttpHost.create("http://192.168.123.114:9200")));}@AfterEachvoid tearDown() throws IOException {this.client.close();}@Testpublic void createMessageIndex() throws IOException {CreateIndexRequest request = new CreateIndexRequest("message");// 2.準備請求的參數:DSL語句request.source(MAPPING_TEMPLATE, XContentType.JSON);// 3.發送請求CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);log.info(GsonUtil.toJson(createIndexResponse));}
刪除索引庫
@Test
void testDeleteMessageIndex() throws IOException {// 1.創建Request對象DeleteIndexRequest request = new DeleteIndexRequest("message");// 2.發送請求client.indices().delete(request, RequestOptions.DEFAULT);
}
判斷索引庫是否存在
@Test
void testExistsMessageIndex() throws IOException {// 1.創建Request對象GetIndexRequest request = new GetIndexRequest("message");// 2.發送請求boolean exists = client.indices().exists(request, RequestOptions.DEFAULT);// 3.輸出System.err.println(exists ? "索引庫已經存在!" : "索引庫不存在!");
}
總結
JavaRestClient操作elasticsearch的流程基本類似。核心是client.indices()方法來獲取索引庫的操作對象。
索引庫操作的基本步驟:
- 初始化RestHighLevelClient
- 創建XxxIndexRequest。XXX是Create、Get、Delete
- 準備DSL( Create時需要,其它是無參)
- 發送請求。調用RestHighLevelClient#indices().xxx()方法,xxx是create、exists、delete
RestClient操作文檔
增加文檔數據
@Testpublic void testIndexDocument() throws IOException {String json ="{\n" +" \"id\":1,\n" +" \"deleted\":0,\n" +" \"fromUserId\":100,\n" +" \"convType\":0,\n" +" \"convId\":130,\n" +" \"msgType\":1,\n" +" \"msgBody\":\"我是王五\",\n" +" \"msgId\":\"942131743446568960\",\n" +" \"payload\":\"\",\n" +" \"msgTime\":\"1699424599731\",\n" +" \"sendResult\":0,\n" +" \"subMsgType\":0,\n" +" \"money\":200.1,\n" +" \"type\":1\n" +"}";IndexRequest request = new IndexRequest("message").id("3");// 2.準備請求的參數:DSL語句request.source(json, XContentType.JSON);// 3.發送請求client.index(request, RequestOptions.DEFAULT);}
查詢文檔
@Test
void testGetDocumentById() throws IOException {// 1.準備RequestGetRequest request = new GetRequest("message", "3");// 2.發送請求,得到響應GetResponse response = client.get(request, RequestOptions.DEFAULT);// 3.解析響應結果String json = response.getSourceAsString();
}
刪除文檔
@Test
void testDeleteDocument() throws IOException {// 1.準備RequestDeleteRequest request = new DeleteRequest("message", "3");// 2.發送請求client.delete(request, RequestOptions.DEFAULT);
}
修改文檔
有修改兩種方式:
- 全量修改:本質是先根據id刪除,再新增
- 增量修改:修改文檔中的指定字段值
在RestClient的API中,全量修改與新增的API完全一致,判斷依據是ID:
- 如果新增時,ID已經存在,則修改
- 如果新增時,ID不存在,則新增
這里不再贅述,我們主要關注增量修改。
與之前類似,也是三步走:
- 1)準備Request對象。這次是修改,所以是UpdateRequest
- 2)準備參數。也就是JSON文檔,里面包含要修改的字段
- 3)更新文檔。這里調用client.update()方法
@Test
void testUpdateDocument() throws IOException {// 1.準備RequestUpdateRequest request = new UpdateRequest("message", "3");// 2.準備請求參數request.doc("fromUserId", "11","msgBody", "土豆土豆,我是地瓜");// 3.發送請求client.update(request, RequestOptions.DEFAULT);
}
批量導入文檔
@Test
void testBulkRequest() throws IOException {// 批量查詢酒店數據 修改為自己的List<Message> messages= messageService.list();// 1.創建RequestBulkRequest request = new BulkRequest();// 2.準備參數,添加多個新增的Requestfor (Message message: messages) {// 2.2.創建新增文檔的Request對象request.add(new IndexRequest("message").id(message.getId().toString()).source(JSON.toJSONString(message), XContentType.JSON));}// 3.發送請求client.bulk(request, RequestOptions.DEFAULT);
}
小結
文檔操作的基本步驟:
- 初始化RestHighLevelClient
- 創建XxxRequest。XXX是Index、Get、Update、Delete、Bulk
- 準備參數(Index、Update、Bulk時需要)
- 發送請求。調用RestHighLevelClient#.xxx()方法,xxx是index、get、update、delete、bulk
- 解析結果(Get時需要)