Spring Data Elasticsearch 和 x-pack 用戶名/密碼驗證鏈接

Elasticsearch Java API 客戶端鏈接

一個是TransportClient,一個是NodeClient,還有一個XPackTransportClientjava

  • TransportClient:

做爲一個外部訪問者,請求ES的集羣,對於集羣而言,它是一個外部因素。node

  • NodeClient

做爲ES集羣的一個節點,它是ES中的一環,其餘的節點對它是感知的。git

  • XPackTransportClient:

服務安裝了 x-pack 插件apache

重要:客戶端版本應該和服務端版本保持一致json

TransportClient旨在被Java高級REST客戶端取代,該客戶端執行HTTP請求而不是序列化的Java請求。 在即將到來的Elasticsearch版本中將不同意使用TransportClient,建議使用Java高級REST客戶端。服務器

上面的警告比較尷尬,可是在 5xx版本中使用仍是沒有問題的,可能使用rest 客戶端兼容性更好作一些。app

Elasticsearch Java Rest API 手冊elasticsearch

Maven Repository

Elasticsearch Java API包已經上傳到 Maven Centralmaven

pom.xml文件中增長:tcp

transport 版本號最好就是與Elasticsearch版本號一致。

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

Transport Client

不設置集羣名稱

// on startup

//此步驟添加IP,至少一個,若是設置了"client.transport.sniff"= true 一個就夠了,由於添加了自動嗅探配置
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));

// on shutdown  關閉client

client.close();

設置集羣名稱

Settings settings = Settings.builder()
        .put("cluster.name", "myClusterName").build();  //設置ES實例的名稱
TransportClient client = new PreBuiltTransportClient(settings);  //自動嗅探整個集羣的狀態,把集羣中其餘ES節點的ip添加到本地的客戶端列表中
//Add transport addresses and do something with the client...

增長自動嗅探配置

Settings settings = Settings.builder()
        .put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);

其餘配置

client.transport.ignore_cluster_name  //設置 true ,忽略鏈接節點集羣名驗證
client.transport.ping_timeout       //ping一個節點的響應時間 默認5秒
client.transport.nodes_sampler_interval //sample/ping 節點的時間間隔,默認是5s

對於ES Client,有兩種形式,一個是TransportClient,一個是NodeClient。兩個的區別爲: TransportClient做爲一個外部訪問者,經過HTTP去請求ES的集羣,對於集羣而言,它是一個外部因素。 NodeClient顧名思義,是做爲ES集羣的一個節點,它是ES中的一環,其餘的節點對它是感知的,不像TransportClient那樣,ES集羣對它一無所知。NodeClient通訊的性能會更好,可是由於是ES的一環,因此它出問題,也會給ES集羣帶來問題。NodeClient能夠設置不做爲數據節點,在elasticsearch.yml中設置,這樣就不會在此節點上分配數據。

若是用ES的節點,仁者見仁智者見智。

實例

package name.quanke.es.study;

import name.quanke.es.study.util.Utils;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.After;
import org.junit.Before;

import java.net.InetAddress;

/**
 * Elasticsearch 5.5.1 的client 和 ElasticsearchTemplate的初始化
 * 做爲一個外部訪問者,請求ES的集羣,對於集羣而言,它是一個外部因素。
 * Created by http://quanke.name on 2017/11/10.
 */
public class ElasticsearchClient {

    protected TransportClient client;

    @Before
    public void setUp() throws Exception {

        Settings esSettings = Settings.builder()
                .put("cluster.name", "utan-es") //設置ES實例的名稱
                .put("client.transport.sniff", true) //自動嗅探整個集羣的狀態,把集羣中其餘ES節點的ip添加到本地的客戶端列表中
                .build();

        /**
         * 這裏的鏈接方式指的是沒有安裝x-pack插件,若是安裝了x-pack則參考{@link ElasticsearchXPackClient}
         * 1. java客戶端的方式是以tcp協議在9300端口上進行通訊
         * 2. http客戶端的方式是以http協議在9200端口上進行通訊
         */
        client = new PreBuiltTransportClient(esSettings)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));

        System.out.println("ElasticsearchClient 鏈接成功");
    }

    @After
    public void tearDown() throws Exception {
        if (client != null) {
            client.close();
        }

    }

    protected void println(SearchResponse searchResponse) {
        Utils.println(searchResponse);
    }

}

XPackTransportClient

若是 ElasticSearch 服務安裝了 x-pack 插件,須要PreBuiltXPackTransportClient實例才能訪問

使用Maven管理項目,把下面代碼增長到pom.xml;

必定要修改默認倉庫地址爲https://artifacts.elastic.co/maven ,由於這個庫沒有上傳到Maven中央倉庫,若是有本身的 maven ,請配置代理

<project ...>

   <repositories>
      <!-- add the elasticsearch repo -->
      <repository>
         <id>elasticsearch-releases</id>
         <url>https://artifacts.elastic.co/maven</url>
         <releases>
            <enabled>true</enabled>
         </releases>
         <snapshots>
            <enabled>false</enabled>
         </snapshots>
      </repository>
      ...
   </repositories>
   ...

   <dependencies>
      <!-- add the x-pack jar as a dependency -->
      <dependency>
         <groupId>org.elasticsearch.client</groupId>
         <artifactId>x-pack-transport</artifactId>
         <version>5.6.3</version>
      </dependency>
      ...
   </dependencies>
   ...

 </project>

實例

/**
 * Elasticsearch XPack Client
 * Created by http://quanke.name on 2017/11/10.
 */

package com.yitong.test;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;

import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.xpack.client.PreBuiltXPackTransportClient;

import com.alibaba.fastjson.JSONObject;

public class ConEsUtil {
//客戶端TransportClient對象
private static TransportClient client = null;
//es集羣名稱,必須和配置文件中的對應
private static String clusterName = "test";
//部署es服務器的ip
private static String networkGost = "127.0.0.1";
//es的port,注意不是http.host,是配置文件中的transport.tcp.port,默認9300.
private static Integer transportTcpPort = 9300;


/**
* 建立es鏈接
*
* @return
*/
public static TransportClient creatConEs() {
if (null ==client) {
Settings settings = Settings.builder()
//嗅探功能
.put("client.transport.ignore_cluster_name", true)
//集羣名稱
.put("cluster.name", clusterName)
/**
* 若是es集羣安裝了x-pack插件則以此種方式鏈接集羣
* 1. java客戶端的方式是以tcp協議在9300端口上進行通訊
* 2. http客戶端的方式是以http協議在9200端口上進行通訊
*/
.put("xpack.security.user", "elastic:changeme")
.build();
try {
client = new PreBuiltXPackTransportClient(settings)
//鏈接es端口
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(networkGost), transportTcpPort));
//client = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(networkGost), Integer.valueOf(transportTcpPort)));

} catch (UnknownHostException e) {
e.printStackTrace();
}
}


return client;
}

public static void main(String[] args) {
TransportClient es = creatConEs();
//es.prepareGet(index,type,3).get();
//
/* IndicesExistsResponse actionGet = client.admin().indices().exists(new IndicesExistsRequest("logstash-oesapp-2018.07")).actionGet();

if(actionGet.isExists()){
System.out.println("存在");
}else{
System.out.println("xxxxxxxx");
}*/
//matchAllQuery(es);
searchByField(es);

}
//經過一個字段和描述查詢({query:{match:{field:description}}})

private static String searchByField(TransportClient client){
ArrayList<String> list = new ArrayList<>();
// MatchQueryBuilder builder = QueryBuilders.matchQuery("name","apache2.access.method");
SearchResponse response = client.prepareSearch(".kibana").setTypes("index-pattern")//.setQuery(builder)
.setFrom(0).setSize(3).get();
SearchHit[] hits = response.getHits().getHits();
for(int i = 0;i<hits.length;i++) {
String sourceAsString = hits[i].getSourceAsString();
list.add(sourceAsString);
}
String s = JSONObject.toJSONString(list);
System.out.println(s);
return s;
}
/**
* 關閉鏈接
*/
/* public static void closeConEs() {
if (client != null) {
client.close();
client = null;
System.out.println("........鏈接已關閉!");
}
}*/

/* public static void matchAllQuery(Client client ) {

SearchResponse res = null;

MatchAllQueryBuilder qb = QueryBuilders.matchAllQuery();

res = client.prepareSearch("logstash-oesapp-2018.07")

.setTypes("allocation_id")

.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)

.setQuery(qb)

.setFrom(0)

.setSize(10)

.execute().actionGet();

for (SearchHit hit: res.getHits().getHits()){

System.out.println(hit.getSourceAsString());

} }*/}

相關文章
相關標籤/搜索