继续 Es 客户端~今天我们来看看 high level rest client ~
以下是视频笔记:
注意,笔记只是视频内容的一个简要记录,因此笔记内容比较简单,完整的内容可以查看视频。
首先创建一个普通的 Maven 项目,然后引入 high level rest client 依赖:
<dependencies>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.10.0</version>
</dependency>
</dependencies>
需要注意,依赖的版本和 Es 的版本要对应。
创建一个索引:
public class HighLevelTest {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
));
//删除已经存在的索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//创建一个索引
CreateIndexRequest blog1 = new CreateIndexRequest("blog");
//配置 settings,分片、副本等信息
blog1.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));
//配置字段类型,字段类型可以通过 JSON 字符串、Map 以及 XContentBuilder 三种方式来构建
//json 字符串的方式
blog1.mapping("{\"properties\": {\"title\": {\"type\": \"text\"}}}", XContentType.JSON);
//执行请求,创建索引
client.indices().create(blog1, RequestOptions.DEFAULT);
//关闭 client
client.close();
}
}
mapping 的配置,还有另外两种方式:
第一种,通过 map 构建 mapping:
public class HighLevelTest {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
));
//删除已经存在的索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//创建一个索引
CreateIndexRequest blog1 = new CreateIndexRequest("blog");
//配置 settings,分片、副本等信息
blog1.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));
//配置字段类型,字段类型可以通过 JSON 字符串、Map 以及 XContentBuilder 三种方式来构建
//json 字符串的方式
// blog1.mapping("{\"properties\": {\"title\": {\"type\": \"text\"}}}", XContentType.JSON);
//map 的方式
Map<String, String> title = new HashMap<>();
title.put("type", "text");
Map<String, Object> properties = new HashMap<>();
properties.put("title", title);
Map<String, Object> mappings = new HashMap<>();
mappings.put("properties", properties);
blog1.mapping(mappings);
//执行请求,创建索引
client.indices().create(blog1, RequestOptions.DEFAULT);
//关闭 client
client.close();
}
}
第二种,通过 XContentBuilder 构建 mapping:
public class HighLevelTest {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
));
//删除已经存在的索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//创建一个索引
CreateIndexRequest blog1 = new CreateIndexRequest("blog");
//配置 settings,分片、副本等信息
blog1.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));
//配置字段类型,字段类型可以通过 JSON 字符串、Map 以及 XContentBuilder 三种方式来构建
//json 字符串的方式
// blog1.mapping("{\"properties\": {\"title\": {\"type\": \"text\"}}}", XContentType.JSON);
//map 的方式
// Map<String, String> title = new HashMap<>();
// title.put("type", "text");
// Map<String, Object> properties = new HashMap<>();
// properties.put("title", title);
// Map<String, Object> mappings = new HashMap<>();
// mappings.put("properties", properties);
// blog1.mapping(mappings);
//XContentBuilder 方式
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
builder.startObject("properties");
builder.startObject("title");
builder.field("type", "text");
builder.endObject();
builder.endObject();
builder.endObject();
blog1.mapping(builder);
//执行请求,创建索引
client.indices().create(blog1, RequestOptions.DEFAULT);
//关闭 client
client.close();
}
}
还可以给索引配置别名:
public class HighLevelTest {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
));
//删除已经存在的索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//创建一个索引
CreateIndexRequest blog1 = new CreateIndexRequest("blog");
//配置 settings,分片、副本等信息
blog1.settings(Settings.builder().put("index.number_of_shards", 3).put("index.number_of_replicas", 2));
//配置字段类型,字段类型可以通过 JSON 字符串、Map 以及 XContentBuilder 三种方式来构建
//json 字符串的方式
// blog1.mapping("{\"properties\": {\"title\": {\"type\": \"text\"}}}", XContentType.JSON);
//map 的方式
// Map<String, String> title = new HashMap<>();
// title.put("type", "text");
// Map<String, Object> properties = new HashMap<>();
// properties.put("title", title);
// Map<String, Object> mappings = new HashMap<>();
// mappings.put("properties", properties);
// blog1.mapping(mappings);
//XContentBuilder 方式
XContentBuilder builder = XContentFactory.jsonBuilder();
builder.startObject();
builder.startObject("properties");
builder.startObject("title");
builder.field("type", "text");
builder.endObject();
builder.endObject();
builder.endObject();
blog1.mapping(builder);
//配置别名
blog1.alias(new Alias("blog_alias"));
//执行请求,创建索引
client.indices().create(blog1, RequestOptions.DEFAULT);
//关闭 client
client.close();
}
}
如果觉得调 API 太麻烦,也可以直接上 JSON:
public class HighLevelTest2 {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
));
//删除已经存在的索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//创建一个索引
CreateIndexRequest blog1 = new CreateIndexRequest("blog");
//直接同构 JSON 配置索引
blog1.source("{\"settings\": {\"number_of_shards\": 3,\"number_of_replicas\": 2},\"mappings\": {\"properties\": {\"title\": {\"type\": \"keyword\"}}},\"aliases\": {\"blog_alias_javaboy\": {}}}", XContentType.JSON);
//执行请求,创建索引
client.indices().create(blog1, RequestOptions.DEFAULT);
//关闭 client
client.close();
}
}
另外还有一些其他的可选配置:
public class HighLevelTest2 {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
));
//删除已经存在的索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//创建一个索引
CreateIndexRequest blog1 = new CreateIndexRequest("blog");
//直接同构 JSON 配置索引
blog1.source("{\"settings\": {\"number_of_shards\": 3,\"number_of_replicas\": 2},\"mappings\": {\"properties\": {\"title\": {\"type\": \"keyword\"}}},\"aliases\": {\"blog_alias_javaboy\": {}}}", XContentType.JSON);
//请求超时时间,连接所有节点的超时时间
blog1.setTimeout(TimeValue.timeValueMinutes(2));
//连接 master 节点的超时时间
blog1.setMasterTimeout(TimeValue.timeValueMinutes(1));
//执行请求,创建索引
client.indices().create(blog1, RequestOptions.DEFAULT);
//关闭 client
client.close();
}
}
前面所有的请求都是同步的,会阻塞的,也可以异步:
public class HighLevelTest2 {
public static void main(String[] args) throws IOException {
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(
new HttpHost("localhost", 9200, "http"),
new HttpHost("localhost", 9201, "http"),
new HttpHost("localhost", 9202, "http")
));
//删除已经存在的索引
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("blog");
client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
//创建一个索引
CreateIndexRequest blog1 = new CreateIndexRequest("blog");
//直接同构 JSON 配置索引
blog1.source("{\"settings\": {\"number_of_shards\": 3,\"number_of_replicas\": 2},\"mappings\": {\"properties\": {\"title\": {\"type\": \"keyword\"}}},\"aliases\": {\"blog_alias_javaboy\": {}}}", XContentType.JSON);
//请求超时时间,连接所有节点的超时时间
blog1.setTimeout(TimeValue.timeValueMinutes(2));
//连接 master 节点的超时时间
blog1.setMasterTimeout(TimeValue.timeValueMinutes(1));
//执行请求,创建索引
// client.indices().create(blog1, RequestOptions.DEFAULT);
//异步创建索引
client.indices().createAsync(blog1, RequestOptions.DEFAULT, new ActionListener<CreateIndexResponse>() {
//请求成功
@Override
public void onResponse(CreateIndexResponse createIndexResponse) {
//关闭 client
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//请求失败
@Override
public void onFailure(Exception e) {
}
});
//关闭 client
// client.close();
}
}