Elasticsearch High Level REST Client 常用 Java API

4,596 阅读2分钟

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\"" +
    "}";
    1. 使用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");
    1. 使用第三方库来序列化beans,如Jackson
ObjectMapper mapper = new ObjectMapper(); 
byte[] json = mapper.writeValueAsBytes(yourbean);
    1. 使用内置的帮助类 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"));