社区日报 第103期 (2017-11-17)
社区日报 • laoyang360 发表了文章 • 0 个评论 • 1758 次浏览 • 2017-11-17 07:54
http://t.cn/RS2kgfB
2、索引膨胀的原因大讨论
http://t.cn/RjxtXPs
3、旧闻新读 | IK分词作者林良益访谈实录
http://t.cn/RjomL5I
4、只等你来 | Elastic Meetup 广州交流会
https://elasticsearch.cn/article/364
编辑:laoyang360
归档:https://elasticsearch.cn/article/384
订阅:https://tinyletter.com/elastic-daily
es preload 内存换出
Elasticsearch • kennywu76 回复了问题 • 3 人关注 • 1 个回复 • 3702 次浏览 • 2017-11-16 18:41
es集群 副本5个的时候会造成 shards丢失 求各位大大看看
Elasticsearch • wq131311 回复了问题 • 2 人关注 • 2 个回复 • 2812 次浏览 • 2017-11-17 11:01
es怎么用本地的Python脚本过滤搜索结果
Elasticsearch • medcl 回复了问题 • 3 人关注 • 2 个回复 • 2937 次浏览 • 2017-12-05 10:30
【北京-JD安全-北辰】招聘测试开发工程师
求职招聘 • qinpengfei 发表了文章 • 1 个评论 • 3116 次浏览 • 2017-11-16 17:09
工作内容:
负责jd安全产品的测试: WAF、感知、加解密等项目的性能、功能的测试
职位要求:
快到碗里来, 据说内推有奖哦 如果合适 肯定会第一时间联系
工作内容:
负责jd安全产品的测试: WAF、感知、加解密等项目的性能、功能的测试
职位要求:
快到碗里来, 据说内推有奖哦 如果合适 肯定会第一时间联系
Kibana怎样接入自己的登陆接口
Kibana • medcl 回复了问题 • 4 人关注 • 1 个回复 • 5889 次浏览 • 2017-12-05 10:31
PreBuiltXPackTransportClient 初始化异常
Elasticsearch • novia 回复了问题 • 2 人关注 • 2 个回复 • 6076 次浏览 • 2017-12-28 09:23
社区日报 第102期 (2017-11-16)
社区日报 • 白衬衣 发表了文章 • 0 个评论 • 2340 次浏览 • 2017-11-16 09:55
http://t.cn/RjSSp1T
2.通过Search Guard 为Elasticsearch 进行安全加固。
https://elasticsearch.cn/article/350
3.一个将ES查询结果以PDF,HTML或CSV形式导出的ES插件
http://t.cn/RjJsItO
4、Elastic Meetup 广州交流会
https://elasticsearch.cn/article/364
编辑:金桥
归档:https://elasticsearch.cn/article/382
订阅:https://tinyletter.com/elastic-daily
Elasticsearch Java API 索引的增删改查(二)
Elasticsearch • quanke 发表了文章 • 1 个评论 • 9086 次浏览 • 2017-11-16 09:53
本节介绍以下 CRUD API:
单文档 APIs
- Index API
- Get API
- Delete API
- Delete By Query API
- Update API
多文档 APIs
- Multi Get API
- Bulk API
- Using Bulk Processor
Multi Get API
Bulk API
注意:所有的单文档的CRUD API,index参数只能接受单一的索引库名称,或者是一个指向单一索引库的alias。
Index API
Index API 允许我们存储一个JSON格式的文档,使数据可以被搜索。文档通过index、type、id唯一确定。我们可以自己提供一个id,或者也使用Index API 为我们自动生成一个。
这里有几种不同的方式来产生JSON格式的文档(document):
- 手动方式,使用原生的byte[]或者String
- 使用Map方式,会自动转换成与之等价的JSON
- 使用第三方库来序列化beans,如Jackson
- 使用内置的帮助类 XContentFactory.jsonBuilder()
手动方式
[数据格式](https://www.elastic.co/guide/e ... t.html)
<br /> String json = "{" +<br /> "\"user\":\"kimchy\"," +<br /> "\"postDate\":\"2013-01-30\"," +<br /> "\"message\":\"trying out Elasticsearch\"" +<br /> "}";<br />
实例
<br /> /** <br /> * 手动生成JSON <br /> */ <br /> @Test <br /> public void CreateJSON(){ <br /> <br /> String json = "{" + <br /> "\"user\":\"fendo\"," + <br /> "\"postDate\":\"2013-01-30\"," + <br /> "\"message\":\"Hell word\"" + <br /> "}"; <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodate") <br /> .setSource(json) <br /> .get(); <br /> System.out.println(response.getResult()); <br /> <br /> } <br />
Map方式
Map是key:value数据类型,可以代表json结构.
<br /> Map<String, Object> json = new HashMap<String, Object>();<br /> json.put("user","kimchy");<br /> json.put("postDate",new Date());<br /> json.put("message","trying out Elasticsearch");<br />
实例
<br /> /** <br /> * 使用集合 <br /> */ <br /> @Test <br /> public void CreateList(){ <br /> <br /> Map<String, Object> json = new HashMap<String, Object>(); <br /> json.put("user","kimchy"); <br /> json.put("postDate","2013-01-30"); <br /> json.put("message","trying out Elasticsearch"); <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodate") <br /> .setSource(json) <br /> .get(); <br /> System.out.println(response.getResult()); <br /> <br /> } <br />
序列化方式
ElasticSearch已经使用了jackson,可以直接使用它把javabean转为json.
<br /> import com.fasterxml.jackson.databind.*;<br /> <br /> // instance a json mapper<br /> ObjectMapper mapper = new ObjectMapper(); // create once, reuse<br /> <br /> // generate json<br /> byte[] json = mapper.writeValueAsBytes(yourbeaninstance);<br />
实例
<br /> /** <br /> * 使用JACKSON序列化 <br /> * @throws Exception <br /> */ <br /> @Test <br /> public void CreateJACKSON() throws Exception{ <br /> <br /> CsdnBlog csdn=new CsdnBlog(); <br /> csdn.setAuthor("fendo"); <br /> csdn.setContent("这是JAVA书籍"); <br /> csdn.setTag("C"); <br /> csdn.setView("100"); <br /> csdn.setTitile("编程"); <br /> csdn.setDate(new Date().toString()); <br /> <br /> // instance a json mapper <br /> ObjectMapper mapper = new ObjectMapper(); // create once, reuse <br /> <br /> // generate json <br /> byte[] json = mapper.writeValueAsBytes(csdn); <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodate") <br /> .setSource(json) <br /> .get(); <br /> System.out.println(response.getResult()); <br /> } <br />
XContentBuilder帮助类方式
ElasticSearch提供了一个内置的帮助类XContentBuilder来产生JSON文档
<br /> // Index name<br /> String _index = response.getIndex();<br /> // Type name<br /> String _type = response.getType();<br /> // Document ID (generated or not)<br /> String _id = response.getId();<br /> // Version (if it's the first time you index this document, you will get: 1)<br /> long _version = response.getVersion();<br /> // status has stored current instance statement.<br /> RestStatus status = response.status();<br />
实例
<br /> /** <br /> * 使用ElasticSearch 帮助类 <br /> * @throws IOException <br /> */ <br /> @Test <br /> public void CreateXContentBuilder() throws IOException{ <br /> <br /> XContentBuilder builder = XContentFactory.jsonBuilder() <br /> .startObject() <br /> .field("user", "ccse") <br /> .field("postDate", new Date()) <br /> .field("message", "this is Elasticsearch") <br /> .endObject(); <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodata").setSource(builder).get(); <br /> System.out.println("创建成功!"); <br /> <br /> <br /> } <br />
综合实例
<br /> <br /> import java.io.IOException; <br /> import java.net.InetAddress; <br /> import java.net.UnknownHostException; <br /> import java.util.Date; <br /> import java.util.HashMap; <br /> import java.util.Map; <br /> <br /> import org.elasticsearch.action.index.IndexResponse; <br /> import org.elasticsearch.client.transport.TransportClient; <br /> import org.elasticsearch.common.settings.Settings; <br /> import org.elasticsearch.common.transport.InetSocketTransportAddress; <br /> import org.elasticsearch.common.xcontent.XContentBuilder; <br /> import org.elasticsearch.common.xcontent.XContentFactory; <br /> import org.elasticsearch.transport.client.PreBuiltTransportClient; <br /> import org.junit.Before; <br /> import org.junit.Test; <br /> <br /> import com.fasterxml.jackson.core.JsonProcessingException; <br /> import com.fasterxml.jackson.databind.ObjectMapper; <br /> <br /> public class CreateIndex { <br /> <br /> private TransportClient client; <br /> <br /> @Before <br /> public void getClient() throws Exception{ <br /> //设置集群名称 <br /> Settings settings = Settings.builder().put("cluster.name", "my-application").build();// 集群名 <br /> //创建client <br /> client = new PreBuiltTransportClient(settings) <br /> .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); <br /> } <br /> <br /> /** <br /> * 手动生成JSON <br /> */ <br /> @Test <br /> public void CreateJSON(){ <br /> <br /> String json = "{" + <br /> "\"user\":\"fendo\"," + <br /> "\"postDate\":\"2013-01-30\"," + <br /> "\"message\":\"Hell word\"" + <br /> "}"; <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodate") <br /> .setSource(json) <br /> .get(); <br /> System.out.println(response.getResult()); <br /> <br /> } <br /> <br /> <br /> /** <br /> * 使用集合 <br /> */ <br /> @Test <br /> public void CreateList(){ <br /> <br /> Map<String, Object> json = new HashMap<String, Object>(); <br /> json.put("user","kimchy"); <br /> json.put("postDate","2013-01-30"); <br /> json.put("message","trying out Elasticsearch"); <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodate") <br /> .setSource(json) <br /> .get(); <br /> System.out.println(response.getResult()); <br /> <br /> } <br /> <br /> /** <br /> * 使用JACKSON序列化 <br /> * @throws Exception <br /> */ <br /> @Test <br /> public void CreateJACKSON() throws Exception{ <br /> <br /> CsdnBlog csdn=new CsdnBlog(); <br /> csdn.setAuthor("fendo"); <br /> csdn.setContent("这是JAVA书籍"); <br /> csdn.setTag("C"); <br /> csdn.setView("100"); <br /> csdn.setTitile("编程"); <br /> csdn.setDate(new Date().toString()); <br /> <br /> // instance a json mapper <br /> ObjectMapper mapper = new ObjectMapper(); // create once, reuse <br /> <br /> // generate json <br /> byte[] json = mapper.writeValueAsBytes(csdn); <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodate") <br /> .setSource(json) <br /> .get(); <br /> System.out.println(response.getResult()); <br /> } <br /> <br /> /** <br /> * 使用ElasticSearch 帮助类 <br /> * @throws IOException <br /> */ <br /> @Test <br /> public void CreateXContentBuilder() throws IOException{ <br /> <br /> XContentBuilder builder = XContentFactory.jsonBuilder() <br /> .startObject() <br /> .field("user", "ccse") <br /> .field("postDate", new Date()) <br /> .field("message", "this is Elasticsearch") <br /> .endObject(); <br /> <br /> IndexResponse response = client.prepareIndex("fendo", "fendodata").setSource(builder).get(); <br /> System.out.println("创建成功!"); <br /> <br /> <br /> } <br /> <br /> } <br />
你还可以通过startArray(string)和endArray()方法添加数组。.field()方法可以接受多种对象类型。你可以给它传递数字、日期、甚至其他XContentBuilder对象。
Get API
根据id查看文档:
<br /> GetResponse response = client.prepareGet("twitter", "tweet", "1").get();<br /> <br />
更多请查看 [rest get API](https://www.elastic.co/guide/e ... t.html) 文档
配置线程
operationThreaded
设置为true
是在不同的线程里执行此次操作
下面的例子是operationThreaded
设置为false
:
<br /> GetResponse response = client.prepareGet("twitter", "tweet", "1")<br /> .setOperationThreaded(false)<br /> .get();<br />
Delete API
根据ID删除:
<br /> DeleteResponse response = client.prepareDelete("twitter", "tweet", "1").get();<br /> <br />
更多请查看 [delete API](https://www.elastic.co/guide/e ... e.html) 文档
配置线程
operationThreaded
设置为true
是在不同的线程里执行此次操作
下面的例子是operationThreaded
设置为false
:
<br /> GetResponse response = client.prepareGet("twitter", "tweet", "1")<br /> .setOperationThreaded(false)<br /> .get();<br />
<br /> DeleteResponse response = client.prepareDelete("twitter", "tweet", "1")<br /> .setOperationThreaded(false)<br /> .get();<br />
Delete By Query API
通过查询条件删除
<br /> BulkByScrollResponse response =<br /> DeleteByQueryAction.INSTANCE.newRequestBuilder(client)<br /> .filter(QueryBuilders.matchQuery("gender", "male")) //查询条件<br /> .source("persons") //index(索引名)<br /> .get(); //执行<br /> <br /> long deleted = response.getDeleted(); //删除文档的数量<br />
如果需要执行的时间比较长,可以使用异步的方式处理,结果在回调里面获取
<br /> DeleteByQueryAction.INSTANCE.newRequestBuilder(client)<br /> .filter(QueryBuilders.matchQuery("gender", "male")) //查询 <br /> .source("persons") //index(索引名) <br /> .execute(new ActionListener<BulkByScrollResponse>() { //回调监听 <br /> @Override<br /> public void onResponse(BulkByScrollResponse response) {<br /> long deleted = response.getDeleted(); //删除文档的数量 <br /> }<br /> @Override<br /> public void onFailure(Exception e) {<br /> // Handle the exception<br /> }<br /> });<br />
Update API
有两种方式更新索引: - 创建
UpdateRequest
,通过client发送; - 使用
prepareUpdate()
方法;
使用UpdateRequest
<br /> UpdateRequest updateRequest = new UpdateRequest();<br /> updateRequest.index("index");<br /> updateRequest.type("type");<br /> updateRequest.id("1");<br /> updateRequest.doc(jsonBuilder()<br /> .startObject()<br /> .field("gender", "male")<br /> .endObject());<br /> client.update(updateRequest).get();<br />
使用
prepareUpdate()
方法这里官方的示例有问题,new Script()参数错误,所以一下代码是我自己写的(2017/11/10)
<br /> client.prepareUpdate("ttl", "doc", "1")<br /> .setScript(new Script("ctx._source.gender = \"male\"" ,ScriptService.ScriptType.INLINE, null, null))//脚本可以是本地文件存储的,如果使用文件存储的脚本,需要设置 ScriptService.ScriptType.FILE <br /> .get();<br /> <br /> client.prepareUpdate("ttl", "doc", "1")<br /> .setDoc(jsonBuilder() //合并到现有文档<br /> .startObject()<br /> .field("gender", "male")<br /> .endObject())<br /> .get();<br />
Update by script
使用脚本更新文档
<br /> UpdateRequest updateRequest = new UpdateRequest("ttl", "doc", "1")<br /> .script(new Script("ctx._source.gender = \"male\""));<br /> client.update(updateRequest).get();<br /> <br />
Update by merging documents
合并文档
<br /> UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")<br /> .doc(jsonBuilder()<br /> .startObject()<br /> .field("gender", "male")<br /> .endObject());<br /> client.update(updateRequest).get();<br />
Upsert
更新插入,如果存在文档就更新,如果不存在就插入
<br /> IndexRequest indexRequest = new IndexRequest("index", "type", "1")<br /> .source(jsonBuilder()<br /> .startObject()<br /> .field("name", "Joe Smith")<br /> .field("gender", "male")<br /> .endObject());<br /> UpdateRequest updateRequest = new UpdateRequest("index", "type", "1")<br /> .doc(jsonBuilder()<br /> .startObject()<br /> .field("gender", "male")<br /> .endObject())<br /> .upsert(indexRequest); //如果不存在此文档 ,就增加 `indexRequest`<br /> client.update(updateRequest).get();<br />
如果index/type/1
存在,类似下面的文档:
<br /> {<br /> "name" : "Joe Dalton",<br /> "gender": "male" <br /> }<br />
如果不存在,会插入新的文档:
<br /> {<br /> "name" : "Joe Smith",<br /> "gender": "male"<br /> }<br />
Multi Get API
一次获取多个文档
<br /> MultiGetResponse multiGetItemResponses = client.prepareMultiGet()<br /> .add("twitter", "tweet", "1") //一个id的方式<br /> .add("twitter", "tweet", "2", "3", "4") //多个id的方式<br /> .add("another", "type", "foo") //可以从另外一个索引获取<br /> .get();<br /> <br /> for (MultiGetItemResponse itemResponse : multiGetItemResponses) { //迭代返回值<br /> GetResponse response = itemResponse.getResponse();<br /> if (response.isExists()) { //判断是否存在 <br /> String json = response.getSourceAsString(); //_source 字段<br /> }<br /> }<br />
更多请浏览REST [multi get](https://www.elastic.co/guide/e ... t.html) 文档
Bulk API
Bulk API,批量插入:
<br /> import static org.elasticsearch.common.xcontent.XContentFactory.*;<br />
<br /> BulkRequestBuilder bulkRequest = client.prepareBulk();<br /> <br /> // either use client#prepare, or use Requests# to directly build index/delete requests<br /> bulkRequest.add(client.prepareIndex("twitter", "tweet", "1")<br /> .setSource(jsonBuilder()<br /> .startObject()<br /> .field("user", "kimchy")<br /> .field("postDate", new Date())<br /> .field("message", "trying out Elasticsearch")<br /> .endObject()<br /> )<br /> );<br /> <br /> bulkRequest.add(client.prepareIndex("twitter", "tweet", "2")<br /> .setSource(jsonBuilder()<br /> .startObject()<br /> .field("user", "kimchy")<br /> .field("postDate", new Date())<br /> .field("message", "another post")<br /> .endObject()<br /> )<br /> );<br /> <br /> BulkResponse bulkResponse = bulkRequest.get();<br /> if (bulkResponse.hasFailures()) {<br /> // process failures by iterating through each bulk response item<br /> //处理失败<br /> }<br />
使用 Bulk Processor
BulkProcessor 提供了一个简单的接口,在给定的大小数量上定时批量自动请求
创建
BulkProcessor
实例
首先创建BulkProcessor
实例
<br /> import org.elasticsearch.action.bulk.BackoffPolicy;<br /> import org.elasticsearch.action.bulk.BulkProcessor;<br /> import org.elasticsearch.common.unit.ByteSizeUnit;<br /> import org.elasticsearch.common.unit.ByteSizeValue;<br /> import org.elasticsearch.common.unit.TimeValue;<br />
<br /> BulkProcessor bulkProcessor = BulkProcessor.builder(<br /> client, //增加elasticsearch客户端<br /> new BulkProcessor.Listener() {<br /> @Override<br /> public void beforeBulk(long executionId,<br /> BulkRequest request) { ... } //调用bulk之前执行 ,例如你可以通过request.numberOfActions()方法知道numberOfActions<br /> <br /> @Override<br /> public void afterBulk(long executionId,<br /> BulkRequest request,<br /> BulkResponse response) { ... } //调用bulk之后执行 ,例如你可以通过request.hasFailures()方法知道是否执行失败<br /> <br /> @Override<br /> public void afterBulk(long executionId,<br /> BulkRequest request,<br /> Throwable failure) { ... } //调用失败抛 Throwable<br /> })<br /> .setBulkActions(10000) //每次10000请求<br /> .setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB)) //拆成5mb一块<br /> .setFlushInterval(TimeValue.timeValueSeconds(5)) //无论请求数量多少,每5秒钟请求一次。<br /> .setConcurrentRequests(1) //设置并发请求的数量。值为0意味着只允许执行一个请求。值为1意味着允许1并发请求。<br /> .setBackoffPolicy(<br /> BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))//设置自定义重复请求机制,最开始等待100毫秒,之后成倍更加,重试3次,当一次或多次重复请求失败后因为计算资源不够抛出 EsRejectedExecutionException 异常,可以通过BackoffPolicy.noBackoff()方法关闭重试机制<br /> .build();<br />
BulkProcessor 默认设置
- bulkActions 1000
- bulkSize 5mb
- 不设置flushInterval
- concurrentRequests 为 1 ,异步执行
- backoffPolicy 重试 8次,等待50毫秒
增加requests
然后增加
requests
到BulkProcessor
<br /> bulkProcessor.add(new IndexRequest("twitter", "tweet", "1").source(/* your doc here */));<br /> bulkProcessor.add(new DeleteRequest("twitter", "tweet", "2"));<br />
关闭 Bulk Processor
当所有文档都处理完成,使用
awaitClose
或close
方法关闭BulkProcessor
:
<br /> bulkProcessor.awaitClose(10, TimeUnit.MINUTES);<br /> <br />
或
<br /> bulkProcessor.close();<br /> <br />
在测试中使用Bulk Processor
如果你在测试种使用Bulk Processor
可以执行同步方法
<br /> BulkProcessor bulkProcessor = BulkProcessor.builder(client, new BulkProcessor.Listener() { /* Listener methods */ })<br /> .setBulkActions(10000)<br /> .setConcurrentRequests(0)<br /> .build();<br /> <br /> // Add your requests<br /> bulkProcessor.add(/* Your requests */);<br /> <br /> // Flush any remaining requests<br /> bulkProcessor.flush();<br /> <br /> // Or close the bulkProcessor if you don't need it anymore<br /> bulkProcessor.close();<br /> <br /> // Refresh your indices<br /> client.admin().indices().prepareRefresh().get();<br /> <br /> // Now you can start searching!<br /> client.prepareSearch().get();<br />
[所有实例](https://gitee.com/quanke/elasticsearch-java-study) 已经上传到Git
更多请浏览 [spring-boot-starter-es](https://github.com/quanke/spring-boot-starter-es) 开源项目
如何有任何问题请关注微信公众号给我留言
Elasticsearch Java API - 客户端连接(TransportClient,PreBuiltXPackTransportClient)(一)
Elasticsearch • quanke 发表了文章 • 1 个评论 • 33916 次浏览 • 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) 开源项目
如何有任何问题请关注微信公众号给我留言
关于分片数确定
Elasticsearch • laoyang360 回复了问题 • 3 人关注 • 1 个回复 • 3991 次浏览 • 2017-11-16 07:14
bulk负载不均
Elasticsearch • laoyang360 回复了问题 • 3 人关注 • 1 个回复 • 2184 次浏览 • 2017-11-16 07:15
es表中的每个字段都被索引了吗?
Elasticsearch • redhat 回复了问题 • 2 人关注 • 1 个回复 • 8420 次浏览 • 2017-11-15 19:07
求问关于grok正则表达式怎么学习啊?
默认分类 • kuanglin 回复了问题 • 2 人关注 • 1 个回复 • 3799 次浏览 • 2017-11-16 15:13
关于es-hadoop 添加ik中文分词的问题
Elasticsearch • forresttee 回复了问题 • 2 人关注 • 2 个回复 • 3178 次浏览 • 2017-11-17 14:07