第一次写博客,有什么问问还请多多指教
参考:(2017-11-07)
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-api.htmlhtml
1、前言
该文档为es的java API,全部操做本质上都是彻底异步执行,在客户端的操做能够被累计而且批量执行。
5.6.0版本被设计于用来在java应用中代替TransportClient,TransportClient将会在未来的版本中被弃用。
2、安装部署
es5.6.3包直接去官网下载
安装head插件参考:http://www.cnblogs.com/hunttown/p/6723286.html
pom:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
3、安装过程遇到的问题
1.org.elasticsearch.plugins.NetworkPlugin: elastic search版本低 尽可能让transport和其版本一致
2.java.lang.IllegalStateException: Message not fully read (request) for requestId [1], action [], readerIndex [21] vs expected [45]; resetting和
java.io.IOException: Invalid string; unexpected character: 180 hex: b4 :若是出现相似这种,通常是客户端版本和依赖包版本不一致形成的
3.参考http://www.cnblogs.com/softidea/p/6080086.html
4、Transport Clientjava
1.初始化client:
//TransportClient不加入到集群中,而只是获得一个或多个传输地址而且在每次访问的时候循环的进行交互
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host1"), 9300))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("host2"), 9300));
client.close();node
2.若是你用了一个不一样于elastic search的集群名字,那你就得设置一下:
Settings settings = Settings.builder().put("cluster.name", "myClusterName").build();
TransportClient client = new PreBuiltTransportClient(settings);
//Add transport addresses and do something with the client...apache
3.传输客户端自带一个集群嗅探特性,能够动态地添加新主机并删除旧主机,当启用这个特性时,传输客户端将链接到其内部节点列表中的节点(即经过1中
addTransportAddress添加的节点),此后,客户端将调用这些节点上的内部集群API来发现可用的数据节点。客户端的内部节点列表将仅被这些数据节点替换。默认状况下,该列表5秒钟刷新一次。请注意,嗅探器链接的IP地址是在节点的es的配置文件中声明的做为发布的地址。
若是该节点不是一个数据节点,列表可能不包括它链接到的原始节点。例如,若是您最初链接到一个主节点,在嗅探以后,不会再有请求访问该主节点,而是访问其余只要有数据的节点。传输客户端不包含非数据节点的缘由是为了不将搜索流量发送到主节点。
嗅探器开启方式:
Settings settings = Settings.builder() .put("client.transport.sniff", true).build();
TransportClient client = new PreBuiltTransportClient(settings);json
其余transport client的设置包括:
client.transport.ignore_cluster_name :设置为true 能够忽略节点链接时对集群名字的校验
client.transport.ping_timeout :设置一个节点在获得response时的等待时间,默认5秒
client.transport.nodes_sampler_interval:多久进行获取/ping 列出的节点而且链接,默认5秒
5、Index API
Index API容许将一个json类型的文档索引到一个特定的索引中而且使其能够被搜索到
1.Use Elasticsearch helpers
这里json化咱们用es提供的内置助手:
import static org.elasticsearch.common.xcontent.XContentFactory.*;
XContentBuilder builder = jsonBuilder().startObject().field("user", "kimchy")
.field("postDate", new Date()) .field("message", "trying out Elasticsearch") .endObject()api
你也能够用tartArray(String) 和 endArray()添加arrays数组,field支持数值、日期、甚至其余XContentBuilder类型,String json = builder.string()能够查看json
2.Index document
//将一个json格式的文档索引到一个叫megacorp的索引中,其类型为employee,id为5
import static org.elasticsearch.common.xcontent.XContentFactory.*;
IndexResponse response = client.prepareIndex("megacorp","employee","5")
.setSource(jsonBuilder().startObject().field("sex","male").field("age",100).endObject()).get();
//若是是已经格式化好的json文档,不用给出id
IndexResponse response = client.prepareIndex("megacorp", "employee").setSource(jsonString, XContentType.JSON) .get();
// 索引名字
String _index = response.getIndex();
//类型
String _type = response.getType();
// 文档id
String _id = response.getId();
// 版本 (第一次索引文档返回1)
long _version = response.getVersion();
// 状态
RestStatus status = response.status();
6、Get API
//经过索引、类型、id进行查询
GetResponse response = client.prepareGet("megacorp", "employee", "5").get();
异步特性:当API的实际执行在同一个节点上时,能够设置线程模型来执行操做,operationThreaded设为true操做将在不一样的线程下执行,false表明在调用线程
执行, GetResponse response = client.prepareGet("twitter", "tweet", "1").setOperationThreaded(false).get();
7、Delete API
//经过索引、类型、id进行删除
DeleteResponse response = client.prepareDelete("megacorp", "employee", "5").get(); 支持设置线程模型
8、Delete By Query API数组
//经过条件过滤来批量删除索引中的文档异步
BulkByScrollResponse response =DeleteByQueryAction.INSTANCE.newRequestBuilder(esClient.client)
.filter(QueryBuilders.matchQuery("age", 18)).source("megacorp").get();
long deleted = response.getDeleted();elasticsearch
//若是运行时间长,但愿异步执行,能够使用execute代替get而且提供一个监听器ide
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("age", "99"))
.source("megacorp")
.execute(new ActionListener<BulkByScrollResponse>() {
public void onResponse(BulkByScrollResponse response) {
long deleted = response.getDeleted();
logger.info("number of deleted documents: {}",deleted);
}
public void onFailure(Exception e) {
// Handle the exception
}
});
9、Update API(博客园的文档编辑实在太难用了,我放弃了,有想看的直接看API文档吧)https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs-update.html