tsx81429 发表于 2024-9-27 08:03:39

Elasticsearch8.x版本中RestHighLevelClient被弃用,新版本中全新的Java客

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();
    }

https://i-blog.csdnimg.cn/blog_migrate/a358c828869be086b2eea75461f06f20.png
删除索引

    @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();
    }
https://i-blog.csdnimg.cn/blog_migrate/db00d1c89ee3889abc764857044e7ff0.png
修改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() throwsIOException {
      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();
    }
https://i-blog.csdnimg.cn/blog_migrate/64da770e0f29fa2d5f02b058cff1ef21.png
批量删除

    @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();
    }
https://i-blog.csdnimg.cn/blog_migrate/4580c1b545984cdd3d0328761103ac56.png
排序查询

    @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();
    }
https://i-blog.csdnimg.cn/blog_migrate/4232fb041adae28226b819f6602e0884.png
组合查询

    @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();
    }
https://i-blog.csdnimg.cn/blog_migrate/1d9f117328b52944c9b34a0336055442.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Elasticsearch8.x版本中RestHighLevelClient被弃用,新版本中全新的Java客