Elasticsearch java API客戶端介紹

基本上官方指南就已經向咱們說明了一切。以下圖所示:html

在這裏插入圖片描述

從官方指南上,ES的java 客戶端分爲兩個大類。分別是:java

下面分別說下這兩種有什麼區別。spring

Java API

在ES 7.0以前最常採用的API,基於TransportClient客戶端。網上大部分ES 客戶端的資料基本都是基於它的。這種方式在ES 7.x後已經不被官方推薦,且在8.0版本中徹底移除它。json

鑑於有不少人還在使用低版本的ES,因此這種方式在一段時間內應該仍是不會消失。咱們來看看它的基本使用示例。segmentfault

首先咱們在maven中引入依賴,api

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>transport</artifactId>
    <version>7.1.1</version>
</dependency>

鏈接一個集羣,dom

Settings settings = Settings.builder()
        .put("cluster.name", "myClusterName").build();

TransportClient client = new PreBuiltTransportClient(settings)
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new TransportAddress(InetAddress.getByName("host2"), 9300));

索引一個文檔,elasticsearch

IndexResponse response = client.prepareIndex("twitter", "_doc", "1")
        .setSource(jsonBuilder()
                    .startObject()
                        .field("user", "kimchy")
                        .field("postDate", new Date())
                        .field("message", "trying out Elasticsearch")
                    .endObject()
                  )
        .get();

Java REST Client

這是官方推薦的客戶端,分爲 Low Level REST Client 和 High Level REST Client,區別在於前者是直接讓你經過 http 和 es 的集羣通訊,它更加靈活,隨之帶來的問題是調用者須要關心的細節也不少。調用者須要對 ES 較爲熟悉才能夠用好這些API。maven

High Level REST Client則是對Low Level REST Client的封裝,它隱藏了大部分ES的細節,使得調用者即便不瞭解ES的細節也能用好客戶端API。ide

下面來看看High Level REST Client的使用示例。

maven引入依賴,

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

根據集羣信息建立客戶端實例,

public RestHighLevelClient restClient() {
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(userName, password));

        RestClientBuilder builder = RestClient.builder(new HttpHost(host, port))
                .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
        RestHighLevelClient client = new RestHighLevelClient(builder);
        return client;

    }

建立索引,

public String createProfileDocument(ProfileDocument document) throws Exception {
        UUID uuid = UUID.randomUUID();
        document.setId(uuid.toString());
        IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, document.getId())
            .source(convertProfileDocumentToMap(document));
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);
        return indexResponse.getResult().name();
    }

性能對比

你們直接看下面這篇文章吧,有詳細的對比數據。

Benchmarking REST client and transport client

若是你英語很差,我能夠大概解釋下。

文章中的實驗從bulk index和search兩個維度測試對比了兩者之間的性能,這篇文章是用es 5.0的版本進行的測試,結果顯示雖然rest client在性能上已經和transport client 相差不大了。並且ES官方還會不斷的優化前者,因此你基本上不用擔憂性能上的瓶頸。

總結

大部分時候你都應該使用 high level的api進行ES操做,雖然本身使用http直接封裝ES的客戶端也是能夠的。可是仍是推薦使用high level的客戶端API。一方面是它隱藏了ES的複雜操做,讓你即便對ES不熟悉也能輕鬆的使用API進行讀寫數據。另外一方面,大機率它比本身的封裝更穩定。

另外,兩種客戶端走的協議和端口也不同,TransportClient客戶端使用的TCP協議,9300端口,而rest client使用的是http協議,走的是9200端口。

另外,spring boot官方有對ES封裝的starter,能夠和spring data集成使用。這種方式用起來確定更方便,不過有個缺點就是更新太慢了,截止到我寫這篇文章,spring data es的版本是3.2.x,只支持到ES 6.8.1的版本。

在這裏插入圖片描述
我我的比較推薦的仍是 High Level REST Client 這種方式。

參考:


關注公衆號:犀牛飼養員的技術筆記

我的博客:http://www.machengyu.net

csdn博客: https://blog.csdn.net/pony_ma...

思否: https://segmentfault.com/u/ma...

相關文章
相關標籤/搜索