SpringBoot整合ES

福建選手阿俊發表於2020-10-27

1:SpringBoot整合hign-level-client

我們接下來用java操作es
檢索場景:
檢索條件的時候,就要給es傳送請求,檢索出真正的商品,展示到介面中,這個請求應該由一段java程式來接受,並且發給es來處理,處理的結果在返回給前端介面,對於java來操作es有如下兩種方式
在這裡插入圖片描述
在這裡插入圖片描述
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high.html
es的官方文件介紹

  • Java高階REST客戶端在Java低階REST客戶端之上工作。它的主要目標是公開API特定的方法,這些方法接受請求物件作為引數並返回響應物件,因此請求編組和響應反編組由客戶機本身處理。
  • 每個API都可以同步或非同步呼叫。同步方法返回一個響應物件,而名稱以async字尾結尾的非同步方法需要一個偵聽器引數,在接收到響應或錯誤時,該偵聽器引數將被通知(在低層客戶端管理的執行緒池中)。
  • Java高階REST客戶端依賴於Elasticsearch核心專案。它接受與TransportClient相同的請求引數,並返回相同的響應物件。

SpringBoot整合hign-level-client
第一步:新建一個mall-search,並且匯入elasticsearch-rest-high-level-client依賴

<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>7.4.2</version>
		</dependency>

虛擬機器中es的版本7.4.2一定要和後端中springboot管理的es版本一致,統一用7.4.2

第二步:對es進行配置,EsConfig

  • 高階客戶端將在內部建立用於根據所提供的構建器執行請求的低階客戶端。這個低階客戶端維護一個連線池並啟動一些執行緒,因此您應該在正確地使用高階客戶端時關閉它,它將依次關閉內部低階客戶端以釋放這些資源。這可以通過結束:
@Configuration
public class MallESConfig {

    @Bean
    public RestHighLevelClient esRestClient(){
//        RestHighLevelClient client = new RestHighLevelClient(
//                RestClient.builder(
//                        new HttpHost("localhost", 9200, "http"),
//                        new HttpHost("localhost", 9201, "http")));

        RestClientBuilder builder = null;
        //原始碼知道:Returns a new {@link RestClientBuilder} to help with {@link RestClient} creation.
        // public HttpHost(String hostname, int port, String scheme) {
         builder = RestClient.builder(new HttpHost("192.168.56.10", 9200, "http"));
        RestHighLevelClient restHighLevelClient=new RestHighLevelClient(builder);
        return restHighLevelClient;
    }

}
server:
  port: 10000
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: mall-search

bootstrap.properties

spring.application.name=mall-search
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.namespace=b2178961-4989-4695-a8e3-bce7f273ed54
spring.cloud.nacos.config.ext-config[0].dataId=Nacos.yml
spring.cloud.nacos.config.ext-config[0].group=dev
spring.cloud.nacos.config.ext-config[0].refresh=true

2:整合-測試儲存

我們從官網中一個瞭解的就是RequestOptions,比如es新增了安全訪問規則,所有請求訪問es都必須帶上一個安全的頭和設定資訊,我們就可以通過RequestOptions對請求進行統一設定

private static final RequestOptions COMMON_OPTIONS;
static {
    RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
    //新增所有請求所需的任何頭。
    builder.addHeader("Authorization", "Bearer " + TOKEN); 
    //定製響應使用者。
    builder.setHttpAsyncResponseConsumerFactory(           
        new HttpAsyncResponseConsumerFactory
            .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
    COMMON_OPTIONS = builder.build();
}
  • addHeader用於需要進行授權或在Elasticsearch前使用代理的header。不需要設定Content-Type頭,因為客戶機將從附加到請求的HttpEntity自動設定它。
  • 可以設定NodeSelector,它控制哪些節點將接收請求。NodeSelector。skip_dedication _masters是一個不錯的選擇。
  • 還可以定製用於緩衝非同步響應的響應使用者。預設使用者將在JVM堆上緩衝最多100MB的響應。如果響應較大,則請求將失敗。例如,您可以降低最大大小,如果您執行在像上面示例那樣的堆受限的環境中,這可能很有用。
  • 一旦你建立了單例,你就可以在請求時使用它:
request.setOptions(COMMON_OPTIONS);
  • 您還可以根據每個請求定製這些選項。例如,這增加了一個額外的標題:
RequestOptions.Builder options = COMMON_OPTIONS.toBuilder();
options.addHeader("cats", "knock things off of other things");
request.setOptions(options);

根據上面分析,在mall-search中的config中匯入對應文件的程式碼

@Configuration
public class MallESConfig {

    //通用的設定項
    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//        builder.addHeader("Authorization", "Bearer " + TOKEN);
//        builder.setHttpAsyncResponseConsumerFactory(
//                new HttpAsyncResponseConsumerFactory
//                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }
  • 同步執行:當以以下方式執行一個IndexRequest時,客戶端會等待返回IndexResponse,然後繼續執行程式碼:
IndexResponse indexResponse = client.index(request, RequestOptions.DEFAULT);
  1. 在無法解析高階REST客戶機中的REST響應、請求超時或類似的情況下(伺服器沒有返回響應),同步呼叫可能會丟擲IOException。
  2. 在伺服器返回4xx或5xx錯誤程式碼的情況下,高階客戶端嘗試解析響應體錯誤細節,然後丟擲通用的ElasticsearchException,並將原始的ResponseException作為抑制異常新增到其中。
  • 非同步執行:執行IndexRequest也可以以非同步方式完成,這樣客戶端就可以直接返回。使用者需要通過將請求和偵聽器傳遞給非同步索引方法來指定如何處理響應或潛在故障:
//執行完成時要執行的IndexRequest和要使用的ActionListener
client.indexAsync(request, RequestOptions.DEFAULT, listener); 

非同步方法不會阻塞並立即返回。一旦ActionListener完成,如果執行成功,則使用onResponse方法回撥;如果執行失敗,則使用onFailure方法回撥。故障場景和預期異常與同步執行情況相同。

測試程式碼:我們按照如下官網測試indexAPI的使用,它提供了很多種方法,我們只使用第一種
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/java-rest-high-document-index.html
一個IndexRequest需要以下引數:

//Index
IndexRequest request = new IndexRequest("posts"); 
//請求的文件id
request.id("1"); 
String jsonString = "{" +
        "\"user\":\"kimchy\"," +
        "\"postDate\":\"2013-01-30\"," +
        "\"message\":\"trying out Elasticsearch\"" +
        "}";
        //以字串形式提供的文件源(也可以把物件轉化成json傳輸)
request.source(jsonString, XContentType.JSON); 

測試

/**
	 * 測試儲存資料到es,更新也可以
	 */
	@Test
	public void indexData() throws IOException {

		IndexRequest request = new IndexRequest("users");
		request.id("1");
		User user=new User();
		user.setName("zlj");
		user.setPassword("123");
		//轉化成json物件
		String string = JSON.toJSONString(user);
		request.source(string, XContentType.JSON);
		//執行儲存操作
		IndexResponse indexResponse=restHighLevelClient.index(request, MallESConfig.COMMON_OPTIONS);

		//提取有用的響應資料
		System.out.println(indexResponse);
	}

	@Data
	class User{

		private String name;
		private String password;
	}

我們先開啟kibana觀察是否有users的資料,結果是沒有的連users都沒有

GET users/_search

執行上面的程式碼,再開啟kibana觀察是否有users的資料,結果顯示成功展示了資料

相關文章