Elasticsearch(ES)有两种连接方式:transport、rest。transport通过TCP方式访问ES(只支持java),rest方式通过http API 访问ES(没有语言限制)。ES官方建议使用rest方式, transport 将计划在后面的版本中废弃。
官方提供low-level rest client(支持5.0及以后版本) 和high-level rest client(支持版本为 5.6及以后版本)。需要java版本为1.8。 High level rest client 接受和Transport Client相同的请求参数,并返回相同的响应对象。本文主要介绍High level rest client 常用的 Java api。
引入maven jar包
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.1.4</version>
</dependency>
初始化客户端
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http")));
关闭客户端
client.close();
文档格式
ES允许我们存储一个JSON格式的文档,可以通过以下几种不同方式产生JSON格式的文档。
- 1.手动方式,使用原生的byte[]或者String
String json = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"2013-01-30\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
-
- 使用Map方式,会自动转换成与之等价的JSON
Map<String, Object> json = new HashMap<String, Object>();
json.put("user","kimchy");
json.put("postDate",new Date());
json.put("message","trying out Elasticsearch");
-
- 使用第三方库来序列化beans,如Jackson
ObjectMapper mapper = new ObjectMapper();
byte[] json = mapper.writeValueAsBytes(yourbean);
-
- 使用内置的帮助类 XContentFactory.jsonBuilder()
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("user", "ccse")
.field("postDate", new Date())
.field("message", "this is Elasticsearch")
.endObject();
index api
新建文档,若文档已经存在,会覆盖之前的文档
IndexRequest request = new IndexRequest(
"posts",
"doc",
"1");
String jsonString = "{" +
"\"user\":\"kimchy\"," +
"\"postDate\":\"2013-01-30\"," +
"\"message\":\"trying out Elasticsearch\"" +
"}";
request.source(jsonString, XContentType.JSON);
update api
更新文档,文档不存在时,返回document missing
UpdateRequest request = new UpdateRequest("posts", "doc", "1")
.doc(builder);
upsert api
文档存在则进行更新,不存在则新建
UpdateRequest request = new UpdateRequest("posts", "doc", "1")
.doc(builder);
UpdateRequest updateRequest = new UpdateRequest(posts", "doc", "1")
.doc(builder).upsert(indexRequest);
也可以根据脚本进行更新
Map<String, Object> parameters = singletonMap("count", 4);
Script inline = new Script(ScriptType.INLINE, "painless", "ctx._source.field += params.count", parameters);
request.script(inline);
Bulk api
批量api可以一次执行多个请求,包括 index,update,upsert,delete等请求。
BulkRequest request = new BulkRequest();
request.add(new IndexRequest("posts", "doc", "1")
.source(XContentType.JSON,"field", "foo"));
request.add(new IndexRequest("posts", "doc", "2")
.source(XContentType.JSON,"field", "bar"));
request.add(new IndexRequest("posts", "doc", "3")
.source(XContentType.JSON,"field", "baz"));