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及之后版本的客户端。
感爱好的小同伴可以去官方文档看看:Elasticsearch官网8.x版本下Java客户端文档—Elasticsearch Java API Client使用
新建maven项目
maven中引入依赖坐标
- <dependency>
- <groupId>co.elastic.clients</groupId>
- <artifactId>elasticsearch-java</artifactId>
- <version>8.1.0</version>
- </dependency>
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.13.1</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.22</version>
- <scope>provided</scope>
- </dependency>
复制代码 创建毗连
- @Test
- public 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);
- // 关闭ES客户端
- transport.close();
- restClient.close();
- }
复制代码 索引index的基本语法
创建索引
- @Test
- public 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();
- }
复制代码 查询索引
- @Test
- public 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();
- }
复制代码
删除索引
- @Test
- public 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的操作
创建User对象
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public class User {
- private String name;
- private String sex;
- private Integer age;
- }
复制代码 添加document
- @Test
- public 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();
- }
复制代码- $\color{red}{注:index中参数为文档所属的索引名,id中参数为当文档的id,document为文档数据,新版本支持直接传入java对象.} $
复制代码 查询document
- @Test
- public 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();
- }
复制代码
修改document
- @Test
- public 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
- @Test
- public 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
- @Test
- public 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();
- }
复制代码
批量删除
- @Test
- public 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();
- }
复制代码 全量查询
- @Test
- public 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();
- }
复制代码 分页查询
- @Test
- public 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();
- }
复制代码
排序查询
- @Test
- public 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();
- }
复制代码 条件查询
- @Test
- public 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();
- }
复制代码
组合查询
- @Test
- public 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();
- }
复制代码- @Test
- public 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();
- }
复制代码 must是必须满足所有条件,should只要满足一个就行
范围查询
- @Test
- public void scopeQueryDocument2() throws IOException {
- RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
- ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
- ElasticsearchClient client = new ElasticsearchClient(transport);
- // 范围查询,gte()表示取大于等于,gt()表示大于,lte()表示小于等于
- SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q
- .range(r -> r.field("age").gte(JsonData.of(20)).lt(JsonData.of(21))))
- , User.class);
- searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
- transport.close();
- restClient.close();
- }
复制代码 含糊查询
- @Test
- public void fuzzyQueryDocument2() throws IOException {
- RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
- ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
- ElasticsearchClient client = new ElasticsearchClient(transport);
- // 模糊查询,fuzziness表示差几个可以查询出来
- SearchResponse<User> searchResponse = client.search(s -> s.index("user_test").query(q -> q
- .fuzzy(f -> f.field("name").value("tst").fuzziness("2")))
- , User.class);
- searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
- transport.close();
- restClient.close();
- }
复制代码 高亮查询
- @Test
- public void highlightQueryDocument2() 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
- .term(t -> t.field("name").value("test3")))
- .highlight(h -> h.fields("name", f -> f.preTags("<font color='red'>").postTags("</font>")))
- , User.class);
- searchResponse.hits().hits().forEach(h -> System.out.println(h.source().toString()));
- transport.close();
- restClient.close();
- }
复制代码 聚合查询
- @Test
- public void aggregateQueryDocument2() 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").aggregations("maxAge", a ->a.max(m -> m.field("age")))
- , User.class);
- searchResponse.aggregations().entrySet().forEach(f -> System.out.println(f.getKey() + ":" + f.getValue().max().value()));
- transport.close();
- restClient.close();
- }
复制代码 分组查询
- @Test
- public void groupQueryDocument2() 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")
- .aggregations("ageGroup", a ->a.terms(t -> t.field("age")))
- , User.class);
- searchResponse.aggregations().get("ageGroup").lterms().buckets().array().forEach(f -> System.out.println(f.key() + ":" + f.docCount()));
- transport.close();
- restClient.close();
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |