High Level REST Client
更新时间:2020-08-18
本文基于Java High Level REST Client 7.x版本,为您介绍Elasticsearch Java API的用法。
准备工作
- 安装Java,要求JDK版本为1.8及以上。
-
创建Baidu Elasticsearch实例,版本7.4.2。
注意 High Level Client能够向上兼容,但为了保证最大程度地使用最新版客户端的特性,推荐High Level Client版本与集群版本一致。
- 创建Java Maven工程,并将如下的pom依赖添加到Java工程的pom.xml文件中。
pom依赖
XML
1<dependency>
2 <groupId>org.elasticsearch.client</groupId>
3 <artifactId>elasticsearch-rest-high-level-client</artifactId>
4 <version>7.4.2</version>
5</dependency>
6<dependency>
7 <groupId>org.apache.logging.log4j</groupId>
8 <artifactId>log4j-core</artifactId>
9 <version>2.7</version>
10</dependency>
11<dependency>
12 <groupId>org.apache.logging.log4j</groupId>
13 <artifactId>log4j-api</artifactId>
14 <version>2.7</version>
15</dependency>
示例
以下代码为使用Create Index API创建索引,使用异步调用的方式写入文档,删除文档,使用Delete API删除该索引等操作的示例,可供参考。
Java
1import java.io.IOException;
2import org.apache.http.HttpHost;
3import org.apache.http.auth.AuthScope;
4import org.apache.http.auth.UsernamePasswordCredentials;
5import org.apache.http.client.CredentialsProvider;
6import org.apache.http.impl.client.BasicCredentialsProvider;
7import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
8import org.elasticsearch.action.ActionListener;
9import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
10import org.elasticsearch.action.delete.DeleteRequest;
11import org.elasticsearch.action.delete.DeleteResponse;
12import org.elasticsearch.action.index.IndexRequest;
13import org.elasticsearch.action.index.IndexResponse;
14import org.elasticsearch.action.support.master.AcknowledgedResponse;
15import org.elasticsearch.client.RequestOptions;
16import org.elasticsearch.client.RestClient;
17import org.elasticsearch.client.RestClientBuilder;
18import org.elasticsearch.client.RestHighLevelClient;
19import org.elasticsearch.client.indices.CreateIndexRequest;
20import org.elasticsearch.client.indices.CreateIndexResponse;
21import org.elasticsearch.common.settings.Settings;
22import org.elasticsearch.common.xcontent.XContentBuilder;
23import org.elasticsearch.common.xcontent.XContentFactory;
24import org.elasticsearch.common.xcontent.XContentType;
25
26public class RestClientTest742 {
27
28 public static void main(String[] args) {
29 final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
30 //访问用户名和密码为您创建Elasticsearch实例时设置的用户名和密码。
31 credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("{访问用户名}", "{访问密码}"));
32 // 通过builder创建rest client,配置http client的HttpClientConfigCallback。
33 // ES HTTP URL 在Baidu Elasticsearch界面中可以查询
34 RestClientBuilder builder = RestClient.builder(new HttpHost("{ES HTTP URL}", 8200))
35 .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
36 @Override
37 public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
38 return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
39 }
40 });
41
42 // RestHighLevelClient实例通过REST low-level client builder进行构造。
43 RestHighLevelClient client = new RestHighLevelClient(builder);
44
45 try {
46 //创建索引
47 CreateIndexRequest createRequest = new CreateIndexRequest("my_index");
48
49 //创建的每个索引都可以有与之关联的特定设置。
50 createRequest.settings(Settings.builder()
51 .put("index.number_of_shards", 3)
52 .put("index.number_of_replicas", 1)
53 .put("index. refresh_interval", "10s")
54 );
55 // 创建索引时创建文档类型映射
56 createRequest.mapping("{\n" +
57 " \"message\": {\n" +
58 " \"properties\": {\n" +
59 " \"message\": {\n" +
60 " \"type\": \"text\"\n" +
61 " }\n" +
62 " }\n" +
63 " }\n" +
64 " }",
65 XContentType.JSON);
66 // 同步执行创建索引操作
67 CreateIndexResponse createIndexResponse = client.indices().create(createRequest, RequestOptions.DEFAULT);
68 System.out.println("create index successfully! response : " + createIndexResponse.toString());
69
70 // 写入文档
71 // 以XContentBuilder对象的形式提供,Elasticsearch 内部会帮我们生成JSON内容
72 XContentBuilder jsonBuilder = XContentFactory.jsonBuilder();
73 jsonBuilder.startObject();
74 {
75 jsonBuilder.field("user", "Kobe Bryant");
76 jsonBuilder.field("number", 24);
77 jsonBuilder.field("message", "One of the greatest basketball players since the 21st century");
78 }
79 jsonBuilder.endObject();
80 IndexRequest indexRequest = new IndexRequest("my_index").id("1").source(jsonBuilder);
81 //异步执行写入文档操作,方法不会阻塞并立即返回。
82 ActionListener<IndexResponse> listener = new ActionListener<IndexResponse>() {
83 @Override
84 public void onResponse(IndexResponse indexResponse) {
85 //执行成功时调用。 Response以参数方式提供
86 System.out.println("Index doc successfully! response : " + indexResponse.toString());
87 }
88
89 @Override
90 public void onFailure(Exception e) {
91 //在失败的情况下调用。 引发的异常以参数方式提供
92 System.out.println("Index doc fail!");
93 e.printStackTrace();
94 }
95 };
96 //异步执行索引请求需要将IndexRequest实例和ActionListener实例传递给异步方法:
97 client.indexAsync(indexRequest, RequestOptions.DEFAULT, listener);
98
99 // 删除文档
100 DeleteRequest deleteRequest = new DeleteRequest("my_index").id("1");
101 // 执行删除文档操作
102 DeleteResponse deleteResponse = client.delete(deleteRequest, RequestOptions.DEFAULT);
103 System.out.println("Delete doc successfully! \n" + deleteResponse.toString() + "\n" + deleteResponse.status());
104
105 // 指定要删除的索引名称
106 DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("my_index");
107 // 执行删除索引操作
108 AcknowledgedResponse deleteIndexResponse = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
109 System.out.println("delete index successfully! response : " + deleteIndexResponse.toString());
110 } catch (IOException ioException) {
111 // 异常处理。
112 ioException.printStackTrace();
113 } finally {
114 // 在不需要使用client后,将client关闭。
115 try {
116 client.close();
117 } catch (IOException e) {
118 e.printStackTrace();
119 }
120 }
121 }
122}
以上示例代码中带{}
的参数需要替换为您具体业务的参数,详情请参见代码注释。
更多Java High Level REST Client的使用特性,请参见Java High Level REST Client官方文档。