一个是TransportClient
,一个是NodeClient
,还有一个XPackTransportClient
java
做为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。node
做为ES集群的一个节点,它是ES中的一环,其余的节点对它是感知的。git
服务安装了 x-pack
插件apache
重要:客户端版本应该和服务端版本保持一致json
TransportClient旨在被Java高级REST客户端取代,该客户端执行HTTP请求而不是序列化的Java请求。 在即将到来的Elasticsearch版本中将不同意使用TransportClient,建议使用Java高级REST客户端。服务器
上面的警告比较尴尬,可是在 5xx版本中使用仍是没有问题的,可能使用rest 客户端兼容性更好作一些。app
Elasticsearch Java Rest API 手册elasticsearch
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>
// 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); } }
若是 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());
} }*/}