Es的java API客户端
在Es7.15版本之后,es官方将它的高级客户端RestHighLevelClient标记为弃用状态。同时推出了全新的java API客户端Elasticsearch Java API Client,该客户端也将在Elasticsearch8.0及以后版本中成为官方推荐使用的客户端。
Elasticsearch Java API Client支持除Vector title search API和Find structure API之外的所有Elasticsearch API。且支持所有API数据类型,并且不再有原始JSON Value属性。它是针对Elasticsearch8.0及之后版本的客户端。
maven中引入依赖坐标
<dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId><version>8.12.2</version></dependency><dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.12.2</version><exclusions><exclusion><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-client</artifactId></exclusion></exclusions></dependency>
- 创建连接
@Beanpublic ElasticsearchClient elasticsearchClient(@Value("${elasticsearch.xxxx}") String serverUrl,@Value("${elasticsearch.xxxxx}") String apiKey) {RestClient restClient = RestClient.builder(HttpHost.create(serverUrl)).setDefaultHeaders(new Header[]{new BasicHeader("Authorization", "ApiKey " + apiKey),}).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());return new ElasticsearchClient(transport);}
- 索引index
@Testpublic void create() throws IOException {// 创建低级客户端RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();// 使用Jackson映射器创建传输层ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());// 创建API客户端ElasticsearchClient client = new ElasticsearchClient(transport);// 创建索引CreateIndexResponse createIndexResponse = client.indices().create(c -> c.index("user_test"));// 响应状态Boolean acknowledged = createIndexResponse.acknowledged();System.out.println("索引操作 = " + acknowledged);// 关闭ES客户端transport.close();restClient.close();}
- 查询索引
@Testpublic void query() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost",9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 查询索引GetIndexResponse getIndexResponse = client.indices().get(e -> e.index("user_test"));System.out.println("getIndexResponse.result() = " + getIndexResponse.result());System.out.println("getIndexResponse.result().keySet() = " + getIndexResponse.result().keySet());transport.close();restClient.close();}
如果查询的index不存在会在控制台抛出index_not_found_exception
- 删除索引
@Testpublic void delete() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 删除索引DeleteIndexResponse deleteIndexResponse = client.indices().delete(e -> e.index("user_test"));System.out.println("删除操作 = " + deleteIndexResponse.acknowledged());transport.close();restClient.close();}
文档document的操作
- 添加document
@Testpublic void addDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 向user对象中添加数据User user = new User("java客户端", "男", 18);// 向索引中添加数据CreateResponse createResponse = client.create(e -> e.index("user_test").id("1001").document(user));System.out.println("createResponse.result() = " + createResponse.result());transport.close();restClient.close();}
注:index中参数为文档所属的索引名,id中参数为当文档的id,document为文档数据,新版本支持直接传入java对象。
- 查询document
@Testpublic void queryDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 构建请求GetResponse<User> getResponse = client.get(e -> e.index("user_test").id("1001"), User.class);System.out.println("getResponse.source().toString() = " + getResponse.source().toString());transport.close();restClient.close();}
注:如果查不到控制台抛出NullPointerException
- 修改document
@Testpublic void modifyDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 使用map集合封装需要修改的内容Map<String, Object> map = new HashMap<>();map.put("name", "java客户端aaa");// 构建请求UpdateResponse<User> updateResponse = client.update(e -> e.index("user_test").id("1001").doc(map), User.class);System.out.println("updateResponse.result() = " + updateResponse.result());transport.close();restClient.close();}
- 删除document
@Testpublic void removeDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 构建请求DeleteResponse deleteResponse = client.delete(e -> e.index("user_test").id("1001"));System.out.println("deleteResponse.result() = " + deleteResponse.result());transport.close();restClient.close();}
- 批量添加document
@Testpublic void batchAddDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 构建一个批量数据集合List<BulkOperation> list = new ArrayList<>();list.add(new BulkOperation.Builder().create(d -> d.document(new User("test2", "男", 19)).id("1002").index("user_test")).build());list.add(new BulkOperation.Builder().create(d -> d.document(new User("test3", "男", 20)).id("1003").index("user_test")).build());list.add(new BulkOperation.Builder().create(d -> d.document(new User("test4", "女", 21)).id("1004").index("user_test")).build());// 调用bulk方法执行批量插入操作BulkResponse bulkResponse = client.bulk(e -> e.index("user_test").operations(list));System.out.println("bulkResponse.items() = " + bulkResponse.items());transport.close();restClient.close();}
批量添加的核心是需要构建一个泛型为BulkOperation的ArrayList集合,实质上是将多个请求包装到一个集合中,进行统一请求,进行构建请求时调用bulk方法,实现批量添加效果。
- 批量删除
@Testpublic void batchDeleteDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 构建一个批量数据集合List<BulkOperation> list = new ArrayList<>();list.add(new BulkOperation.Builder().delete(d -> d.id("1002").index("user_test")).build());list.add(new BulkOperation.Builder().delete(d -> d.id("1003").index("user_test")).build());// 调用bulk方法执行批量插入操作BulkResponse bulkResponse = client.bulk(e -> e.index("user_test").operations(list));System.out.println("bulkResponse.items() = " + bulkResponse.items());transport.close();restClient.close();}
- 全量查询
@Testpublic void queryAllDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 全量查询SearchResponse<User> searchResponse = client.search(e -> e.index("user_test").query(q -> q.matchAll(m -> m)), User.class);HitsMetadata<User> hits = searchResponse.hits();for (Hit<User> hit : hits.hits()) {System.out.println("user = " + hit.source().toString());}System.out.println("searchResponse.hits().total().value() = " + searchResponse.hits().total().value());transport.close();restClient.close();}
- 分页查询
@Testpublic void pagingQueryDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 分页查询SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q.matchAll(m -> m)).from(2).size(2), User.class);searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));transport.close();restClient.close();}
分页查询就是在全量查询的基础上增加了从第几条开始,每页显示几条
- 排序查询
@Testpublic void sortQueryDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 排序查询SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q.matchAll(m -> m)).sort(o -> o.field(f -> f.field("age").order(SortOrder.Asc))), User.class);searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));transport.close();restClient.close();}
- 条件查询
@Testpublic void conditionQueryDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 条件查询SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q.matchAll(m -> m)).sort(o -> o.field(f -> f.field("age").order(SortOrder.Asc))).source(r -> r.filter(f -> f.includes("name", "age").excludes(""))), User.class);searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));transport.close();restClient.close();}
includes是显示的字段,excludes是排除的字段
- 组合查询
@Testpublic void combinationQueryDocument() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 组合查询SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q.bool(b -> b.must(m -> m.match(u -> u.field("age").query(21))).must(m -> m.match(u -> u.field("sex").query("男"))).mustNot(m -> m.match(u -> u.field("sex").query("女"))))), User.class);searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));transport.close();restClient.close();}@Testpublic void combinationQueryDocument2() throws IOException {RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);// 组合查询SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q.bool(b -> b.should(h -> h.match(u -> u.field("age").query(19))).should(h -> h.match(u -> u.field("sex").query("男"))))), User.class);searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));transport.close();restClient.close();}