Elasticsearch Java API - 客户端连接(TransportClient,PreBuiltXPackTransportClient)(一)
quanke 发表了文章 • 1 个评论 • 33911 次浏览 • 2017-11-16 09:52
Elasticsearch Java API 客户端连接
一个是TransportClient
,一个是NodeClient
,还有一个XPackTransportClient
- TransportClient:
作为一个外部访问者,请求ES的集群,对于集群而言,它是一个外部因素。
- NodeClient
作为ES集群的一个节点,它是ES中的一环,其他的节点对它是感知的。
- XPackTransportClient:
服务安装了x-pack
插件
重要:客户端版本应该和服务端版本保持一致
TransportClient旨在被Java高级REST客户端取代,该客户端执行HTTP请求而不是序列化的Java请求。 在即将到来的Elasticsearch版本中将不赞成使用TransportClient,建议使用Java高级REST客户端。
上面的警告比较尴尬,但是在 5xx版本中使用还是没有问题的,可能使用rest 客户端兼容性更好做一些。
[Elasticsearch Java Rest API 手册](https://www.gitbook.com/book/q ... a-rest)
Maven Repository
Elasticsearch Java API包已经上传到 [Maven Central](http://search.maven.org/%23sea ... h%2522)
在pom.xml
文件中增加:
transport 版本号最好就是与Elasticsearch版本号一致。
```
org.elasticsearch.client
transport
5.6.3
```
### 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);
}
}
```
本实例代码已经上传到 Git [ElasticsearchClient.java](https://gitee.com/quanke/elast ... .java))
[所有实例](https://gitee.com/quanke/elasticsearch-java-study) 已经上传到Git
### XPackTransportClient
如果 `ElasticSearch ` 服务安装了 `x-pack` 插件,需要`PreBuiltXPackTransportClient`实例才能访问
使用Maven管理项目,把下面代码增加到`pom.xml`;
一定要修改默认仓库地址为https://artifacts.elastic.co/maven ,因为这个库没有上传到Maven中央仓库,如果有自己的 maven ,请配置代理
```
elasticsearch-releases
https://artifacts.elastic.co/maven</url>
true
false
...
...
org.elasticsearch.client
x-pack-transport
5.6.3
...
...
```
#### 实例
```
/**
* Elasticsearch XPack Client
* Created by http://quanke.name on 2017/11/10.
*/
public class ElasticsearchXPackClient {
protected TransportClient client;
@Before
public void setUp() throws Exception {
/**
* 如果es集群安装了x-pack插件则以此种方式连接集群
* 1. java客户端的方式是以tcp协议在9300端口上进行通信
* 2. http客户端的方式是以http协议在9200端口上进行通信
*/
Settings settings = Settings.builder()
.put("xpack.security.user", "elastic:utan100")
.put("cluster.name", "utan-es")
.build();
client = new PreBuiltXPackTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.1.10"), 9300));
// final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
// credentialsProvider.setCredentials(AuthScope.ANY,
// new UsernamePasswordCredentials("elastic", "utan100"));
System.out.println("ElasticsearchXPackClient 启动成功");
}
@Test
public void testClientConnection() throws Exception {
System.out.println("--------------------------");
}
@After
public void tearDown() throws Exception {
if (client != null) {
client.close();
}
}
protected void println(SearchResponse searchResponse) {
Utils.println(searchResponse);
}
}
```
本实例代码已经上传到 Git [ ElasticsearchXPackClient.java](https://gitee.com/quanke/elast ... .java))
[所有实例](https://gitee.com/quanke/elasticsearch-java-study) 已经上传到Git
更多请浏览 [spring-boot-starter-es](https://github.com/quanke/spring-boot-starter-es) 开源项目
如何有任何问题请关注微信公众号给我留言
关于分片数确定
laoyang360 回复了问题 • 3 人关注 • 1 个回复 • 3989 次浏览 • 2017-11-16 07:14
bulk负载不均
laoyang360 回复了问题 • 3 人关注 • 1 个回复 • 2183 次浏览 • 2017-11-16 07:15
es表中的每个字段都被索引了吗?
redhat 回复了问题 • 2 人关注 • 1 个回复 • 8416 次浏览 • 2017-11-15 19:07
关于es-hadoop 添加ik中文分词的问题
forresttee 回复了问题 • 2 人关注 • 2 个回复 • 3177 次浏览 • 2017-11-17 14:07
新手 elasticsearch api 根据某个字段做数据库中的in操作 有没有具体的api 求助
chenglp 回复了问题 • 2 人关注 • 1 个回复 • 3708 次浏览 • 2017-11-15 17:12
ES 如何将新文档的索引从 In-memory buffer 写入到文件系统缓存
redhat 回复了问题 • 4 人关注 • 2 个回复 • 5031 次浏览 • 2017-11-15 19:12
TB级json数据导入elasticsearch问题?
laoyang360 回复了问题 • 2 人关注 • 1 个回复 • 2795 次浏览 • 2017-11-15 18:36
elasticsearch 滚动重启工具
xiaoke 回复了问题 • 2 人关注 • 1 个回复 • 2630 次浏览 • 2017-11-15 15:02
_id 批量查询效率问题
诗兄 回复了问题 • 4 人关注 • 4 个回复 • 6438 次浏览 • 2018-04-20 15:53
elasticsearch5中删除索引中的过期文档
novia 回复了问题 • 1 人关注 • 1 个回复 • 3913 次浏览 • 2017-11-15 11:17
如何获取elasticsearch存储数据的时机
medcl 回复了问题 • 3 人关注 • 2 个回复 • 3309 次浏览 • 2017-11-16 10:07
从一个网段的数据迁移到另外一个网段,请问我这种构想合理吗?如果合理,怎么配置呢?
bjfk2006 回复了问题 • 3 人关注 • 3 个回复 • 3808 次浏览 • 2017-11-14 19:57
es5.6执行脚本更新报错
kennywu76 回复了问题 • 2 人关注 • 2 个回复 • 3939 次浏览 • 2017-11-15 12:17
spark elasticsearch 异常: PowerSet: Too many elements to create a power set 40
mazedfishs 发表了文章 • 0 个评论 • 2358 次浏览 • 2017-11-14 17:22
org.elasticsearch.hadoop.EsHadoopIllegalArgumentException: Too many elements to create a power set 54
at org.elasticsearch.hadoop.util.Assert.isTrue(Assert.java:50)
at org.elasticsearch.hadoop.rest.ShardSorter$PowerSet.(ShardSorter.java:218)
at org.elasticsearch.hadoop.rest.ShardSorter.powerList(ShardSorter.java:202)
at org.elasticsearch.hadoop.rest.ShardSorter.checkCombo(ShardSorter.java:89)
at org.elasticsearch.hadoop.rest.ShardSorter.find(ShardSorter.java:85)
at org.elasticsearch.hadoop.rest.RestRepository.doGetReadTargetShards(RestRepository.java:352)
at org.elasticsearch.hadoop.rest.RestRepository.getReadTargetShards(RestRepository.java:295)
at org.elasticsearch.hadoop.rest.RestService.findPartitions(RestService.java:253)
at org.elasticsearch.spark.rdd.AbstractEsRDD.esPartitions$lzycompute(AbstractEsRDD.scala:61)
at org.elasticsearch.spark.rdd.AbstractEsRDD.esPartitions(AbstractEsRDD.scala:60)
at org.elasticsearch.spark.rdd.AbstractEsRDD.getPartitions(AbstractEsRDD.scala:27)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)
at scala.Option.getOrElse(Option.scala:120)
at org.apache.spark.rdd.RDD.partitions(RDD.scala:237)
at org.apache.spark.rdd.MapPartitionsRDD.getPartitions(MapPartitionsRDD.scala:35)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:239)
at org.apache.spark.rdd.RDD$$anonfun$partitions$2.apply(RDD.scala:237)Users with the same issue
解释:
Read failure when index/alias spread among 32 or more nodes
https://github.com/elastic/ela ... s/737