1. 程式人生 > >Java操作Elasticsearch 之 [Java High Level REST Clientedit]

Java操作Elasticsearch 之 [Java High Level REST Clientedit]

![](https://img2020.cnblogs.com/other/2024393/202009/2024393-20200923163318738-1959224629.jpg) # 1. 簡述 * `Elasticsearch` 是基於 `Lucene` 開發的一個分散式全文檢索框架,向 `Elasticsearch` 中儲存和從 `Elasticsearch` 中查詢,格式是json。 * 向 `Elasticsearch` 中儲存資料,其實就是向 `es` 中的 `index` 下面的 `type` 中儲存 `json` 型別的資料。 * `elasticsearch` 提供了很多語言的客戶端用於操作 `elasticsearch` 服務,例如: `java` 、 `python` 、 `.net` 、 `JavaScript` 、 `PHP` 等。本文主要介紹如何使用 `java` 語言來操作 `elasticsearch` 服務。在 `elasticsearch ` 的官網上提供了兩種 `java` 語言的 `API` ,一種是 **`Java Transport Client`**,一種是 **`Java REST Client`**。 > **`Java Transport Client`**** 是基於 TCP 協議互動的,**在 `elasticsearch 7.0+` 版本後官方不再贊成使用,在Elasticsearch 8.0的版本中完全移除 `TransportClient` > > ** `Java REST Client` 是基於 HTTP 協議互動,**而 `Java REST Client` 又分為 `Java Low Level REST Client` 和 `Java High Level REST Client` * `Java High Level REST Client` 是在 `Java Low Level REST Client` 的基礎上做了封裝,使其以更加面向物件和操作更加便利的方式呼叫 `elasticsearch` 服務。 > 官方推薦使用 `Java High Level REST Client` ,因為在實際使用中, `Java Transport Client` 在大併發的情況下會出現連線不穩定的情況。 > 那接下來我們就來看看 `elasticsearch` 提供的 `Java High Level REST Client` (以下簡稱高階REST客戶端)的一些基礎的操作,跟多的操作大家自行閱讀elasticsearch的官方文件: `[https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html)`

# 2. 準備 * 環境: - `Windows 10` - `elasticsearch 7.91` - `IDEA` - `Maven` - `Java 8` > 高階客戶端需要 `Java 1.8` 並依賴於 `Elasticsearch core` 專案 * 依賴: ``` xml ``` # 3. 初始化 * 例項需要構建 [REST 低階客戶端生成器](https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-low-usage-initialization.html),如下所示: `RestHighLevelClient` ``` java RestHighLevelClient client = new RestHighLevelClient( RestClient.builder( new HttpHost("localhost", 9200, "http"), new HttpHost("localhost", 9201, "http"))); ``` * 高階客戶端將在內部建立用於基於提供的生成器執行請求的低階客戶端。該低階客戶端維護一個連線池並啟動一些執行緒,因此,當您很好地完成高階客戶端時,您應該關閉該高階客戶端,然後關閉內部低階客戶端以釋放這些資源。這可以通過 以下時間完成: `close` ``` java client.close(); ``` > 在有關 Java 高階客戶端的本文件的其餘部分中,例項將引用為 。 `RestHighLevelClient` `client`
**案例:**  * 查詢 `index` 程式碼: ``` java public static void main(String[] args) { RestClientBuilder builder = RestClient.builder( new HttpHost( "127.0.0.1", //es主機 IP 9200 // es 埠http ) ); RestHighLevelClient client = new RestHighLevelClient(builder); GetRequest request = new GetRequest( "blog1", //索引 "1" //文件ID ); //當針對不存在的索引執行獲取請求時,響應404狀態碼,將引發IOException,需要按如下方式處理: GetResponse documentFields = null; try { documentFields = client.get(request, RequestOptions.DEFAULT); } catch (IOException e) { e.printStackTrace(); ////處理因為索引不存在而丟擲的異常情況 } System.out.println(documentFields); try { client.close(); } catch (IOException e) { e.printStackTrace(); } } ``` * 查詢結果: ``` json { "_index": "blog1", "_type": "_doc", "_id": "1", "_version": 1, "_seq_no": 0, "_primary_term": 1, "found": true, "_source": { "age": 1, "country": "fuzhou", "date": "2020-09-10", "name": "ngitvusercancel" } } ``` > 上述是一個案例的展示,讓我們初步瞭解通過 `Java ` 的高階 `restful` 客戶端來訪問, 下面我們將進行相關 `Api` 的介紹 # 4. 索引 API (Index Api) ## 4.1 建立索引(Create Index API) ** ### 4.1.1 案例: ``` java /* * 建立索引. * url:https://i-code.online/ */ public static void main(String[] args) { //建立連結資訊 RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("127.0.0.1",9200))); //建立索引請求 索引名稱 student CreateIndexRequest createIndexRequest = new CreateIndexRequest("student-1"); //建立索引時可以設定與之相關的 特定配置 createIndexRequest.settings(Settings.builder() .put("index.number_of_shards",3) //分片數 .put("index.number_of_replicas",2) //備份數 ); //建立文件型別對映 createIndexRequest.mapping("{\n" + " \"properties\": {\n" + " \"id\": {\n" + " \"type\": \"long\",\n" + " \"store\": true\n" + " },\n" + " \"name\": {\n" + " \"type\": \"text\",\n" + " \"index\": true,\n" + " \"analyzer\": \"ik_max_word\"\n" + " },\n" + " \"content\": {\n" + " \"type\": \"text\",\n" + " \"index\": true,\n" + " \"analyzer\": \"ik_max_word\"\n" + " }\n" + " }\n" + "}", XContentType.JSON //型別對映,需要的是一個JSON字串 ); //可選引數 //超時,等待所有節點被確認(使用TimeValue方式) createIndexRequest.setTimeout(TimeValue.timeValueMinutes(1)); try { //同步執行 CreateIndexResponse createIndexResponse = client.indices().create(createIndexRequest, RequestOptions.DEFAULT); //返回的CreateIndexResponse允許檢索有關執行的操作的資訊,如下所示: boolean acknowledged = createIndexResponse.isAcknowledged();//指示是否所有節點都已確認請求 boolean shardsAcknowledged = createIndexResponse.isShardsAcknowledged();//指示是否在超時之前為索引中的每個分片啟動了必需的分片副本數 System.out.println("acknowledged:"+acknowledged); System.out.println("shardsAcknowledged:"+shardsAcknowledged); System.out.println(createIndexResponse.index()); } catch (IOException e) { e.printStackTrace(); } try { //關閉客戶端連結 client.close(); } catch (IOException e) { e.printStackTrace(); } } ``` > 上述是一個 index 建立的過程,具體的細節操作 `api` 下面詳解 ### 4.1.2 建立索引請求 * 需要引數: `CreateIndexRequestindex` ``` java CreateIndexRequest request = new CreateIndexRequest("twitter");//<1> ``` > <1>要建立索引 ### 4.1.3 索引設定 * 建立的每個索引都可以具有與其關聯的特定設定。 ``` java //此索引的設定 request.settings(Settings.builder() .put("index.number_of_shards", 3) //分片數 .put("index.number_of_replicas", 2)//備份數 ); ``` ### 4.1.4 索引對映 * 可以建立索引,並建立其文件型別的對映 ``` java request.mapping( "{\n" + " "properties": {\n" + " "message": {\n" + " "type": "text"\n" + " }\n" + " }\n" + "}", //<1> 要定義的型別 XContentType.JSON); //<2> 此型別的對映,作為 JSON 字串提供 ``` > <1>要定義的型別 > <2>此型別的對映,作為 `JSON ` 字串提供 * 除了上面顯示的示例之外,還可以以不同的方式提供對映源: `String` ```