松哥原創的 Spring Boot 視頻教程已經殺青,感興趣的小夥伴戳這裏-->Spring Boot+Vue+微人事視頻教程
今天終於可以和小夥伴們分享通過 Java 來操作 ElasticSearch 的相關 API 啦~今天先來看一個簡單的~
Java API 概覽
手動發送 HTTP 請求
低級客戶端
以下是視頻筆記:
注意,筆記只是視頻內容的一個簡要記錄,因此筆記內容比較簡單,完整的內容可以查看視頻。
25.ElasticSearch Java API 概覽
Java 操作 Es 的方案:
-
直接使用 HTTP 請求
直接使用 HTTP 請求,去操作 Es。HTTP 請求工具,可以使用 Java 自帶的 HttpUrlConnection,也可以使用一些 HTTP 請求庫,例如 HttpClient、OKHttp、Spring 中的 RestTemplate 都可以。
這種方式有一個弊端,就是要自己組裝請求參數,自己去解析響應的 JSON。
-
Low Level REST Client
用於 Es 的官方的低級客戶端。這種方式允許通過 HTTP 與 Es 集羣進行通信,但是請求時候的 JSON 參數和響應的 JSON 參數交給用戶去處理。這種方式好處就是兼容所有的 Es 版本。但是就是數據處理比較麻煩。
-
High Level REST Client
用戶 Es 的官方的高級客戶端。這種方式允許通過 HTTP 與 Es 集羣進行通信,它是基於 Low Level REST Client,但是提供了很多 API,開發者不需要自己去組裝參數,也不需要自己去解析響應 JSON 。這種方式使用起來更加直接。但是需要注意,這種方式,所使用的依賴庫的版本要和 Es 對應。
-
TransportClient
TransportClient 在 Es7 中已經被棄用,在 Es8 中將被完全刪除。
26.ElasticSearch 普通 HTTP 請求
新建一個普通的 JavaSE 工程,添加如下代碼:
public class HttpRequestTest {
public static void main(String[] args) throws IOException {
URL url = new URL("http://localhost:9200/books/_search?pretty=true");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
if (con.getResponseCode() == 200) {
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
}
}
}
這裏使用到的請求工具是 HttpURLConnection,開發者也可以使用 HttpClient、OkHttp、或者 Spring 中的 RestTemplate。
27.ElasticSearch Java Low Level REST Client
首先創建一個普通的 Maven 工程,添加如下依賴:
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.10.0</version>
</dependency>
</dependencies>
然後添加如下代碼,發起一個簡單的查詢請求:
public class LowLevelTest {
public static void main(String[] args) throws IOException {
//1.構建一個 RestClient 對象
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
);
//2.如果需要在請求頭中設置認證信息等,可以通過 builder 來設置
// builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
RestClient restClient = builder.build();
//3.構建請求
Request request = new Request("GET", "/books/_search");
//添加請求參數
request.addParameter("pretty","true");
//4.發起請求,發起請求有兩種方式,可以同步,可以異步
//這種請求發起方式,會阻塞後面的代碼
Response response = restClient.performRequest(request);
//5.解析 response,獲取響應結果
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
//最後記得關閉 RestClient
restClient.close();
}
}
這個查詢請求,是一個同步請求,在請求的過程中,後面的代碼會被阻塞,如果不希望後面的代碼被阻塞,可以使用異步請求。
public class LowLevelTest2 {
public static void main(String[] args) throws IOException {
//1.構建一個 RestClient 對象
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
);
//2.如果需要在請求頭中設置認證信息等,可以通過 builder 來設置
// builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
RestClient restClient = builder.build();
//3.構建請求
Request request = new Request("GET", "/books/_search");
//添加請求參數
request.addParameter("pretty","true");
//4.發起請求,發起請求有兩種方式,可以同步,可以異步
//異步請求
restClient.performRequestAsync(request, new ResponseListener() {
//請求成功的回調
@Override
public void onSuccess(Response response) {
//5.解析 response,獲取響應結果
try {
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
//最後記得關閉 RestClient
restClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//請求失敗的回調
@Override
public void onFailure(Exception e) {
}
});
}
}
開發者在請求時,也可以攜帶 JSON 參數。
public class LowLevelTest3 {
public static void main(String[] args) throws IOException {
//1.構建一個 RestClient 對象
RestClientBuilder builder = RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
);
//2.如果需要在請求頭中設置認證信息等,可以通過 builder 來設置
// builder.setDefaultHeaders(new Header[]{new BasicHeader("key","value")});
RestClient restClient = builder.build();
//3.構建請求
Request request = new Request("GET", "/books/_search");
//添加請求參數
request.addParameter("pretty","true");
//添加請求體
request.setEntity(new NStringEntity("{\"query\": {\"term\": {\"name\": {\"value\": \"java\"}}}}", ContentType.APPLICATION_JSON));
//4.發起請求,發起請求有兩種方式,可以同步,可以異步
//異步請求
restClient.performRequestAsync(request, new ResponseListener() {
//請求成功的回調
@Override
public void onSuccess(Response response) {
//5.解析 response,獲取響應結果
try {
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
}
br.close();
//最後記得關閉 RestClient
restClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//請求失敗的回調
@Override
public void onFailure(Exception e) {
}
});
}
}
ElasticSearch 基礎知識:
-
打算出一個 ElasticSearch 教程,誰贊成,誰反對? -
ElasticSearch 從安裝開始 -
ElasticSearch 第三彈,核心概念介紹 -
ElasticSearch 中的中文分詞器該怎麼玩? -
ElasticSearch 索引基本操作 -
ElasticSearch 文檔的添加、獲取以及更新 -
ElasticSearch 文檔的刪除和批量操作 -
ElasticSearch 文檔路由,你的數據到底存在哪一個分片上? -
ElasticSearch 併發的處理方式:鎖和版本控制 -
ElasticSearch 中的倒排索引到底是什麼? -
ElasticSearch 動態映射與靜態映射 -
ElasticSearch 四種字段類型詳解 -
ElasticSearch 中的地理類型和特殊類型 -
ElasticSearch 23 種映射參數詳解 -
ElasticSearch 如何配置某個字段的權重? -
ElasticSearch 23 種映射參數詳解【3】 -
ElasticSearch 映射模版 -
ElasticSearch 搜索入門 -
ElasticSearch 全文搜索怎麼玩? -
ElasticSearch 打錯字還能搜索到?試試 fuzzy query! -
ElasticSearch 複合查詢,理解 Es 中的文檔評分策略! -
想搜索附近評分較高的餐廳,ElasticSearch 大顯身手! -
ElasticSearch 如何像 MySQL 一樣做多表聯合查詢? -
ElasticSearch 地理位置查詢與特殊查詢 -
ElasticSearch 搜索高亮與排序 -
ElasticSearch 指標聚合 -
ElasticSearch 桶聚合 -
ElasticSearch 管道聚合
本文分享自微信公衆號 - 江南一點雨(a_javaboy)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。