前言


elasaticsearch新版java客户端详细教程,支持响应式编程,Lambda表达式。兼容旧版High Level Rest Client。网上相关教程少,我在这里出一个。elasaticsearch相关安装这里不介绍了

一、引入依赖

 		<dependency>
            <groupId>co.elastic.clients</groupId>
            <artifactId>elasticsearch-java</artifactId>
            <version>8.2.2</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.3</version>
        </dependency>

        <dependency>
            <groupId>jakarta.json</groupId>
            <artifactId>jakarta.json-api</artifactId>
            <version>2.0.1</version>
        </dependency>

二、配置连接

有几种方式,这里介绍两种,如果不考虑之前旧版High Level Rest Client的客户端采用第一种就行

1.直接配置连接

	//同步客户端
    public ElasticsearchClient elasticsearchClient(){
        ElasticsearchTransport transport = getElasticsearchTransport();
// And create the API client
        ElasticsearchClient client = new ElasticsearchClient(transport);
        return client;
    }

    //elasticsearch异步客户端
    public ElasticsearchAsyncClient elasticsearchAsyncClient (){
        ElasticsearchTransport transport = getElasticsearchTransport();
// And create the API client
        ElasticsearchAsyncClient client = new ElasticsearchAsyncClient(transport);
        return client;
    }
	//ElasticsearchTransport用于创建客户端
    public ElasticsearchTransport getElasticsearchTransport(){
        CredentialsProvider credentialsProvider =
                new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(username, password));//配置用户名密码
        // Create the low-level client
        RestClient restClient = RestClient.builder(
                        new HttpHost(host, port)) //配置路径 端口
                .setHttpClientConfigCallback(httpAsyncClientBuilder ->
                        httpAsyncClientBuilder.setDefaultCredentialsProvider(credentialsProvider))
                .build();
// Create the transport with a Jackson mapper
        ElasticsearchTransport transport = new RestClientTransport(
                restClient, new JacksonJsonpMapper());
        return transport;
    }

阻塞和异步客户端
API 客户端有两种形式:阻塞和异步。异步客户端上的所有方法都返回一个标准CompletableFuture.
根据需要,两种风格可以同时使用,共享相同的传输对象。我们这里就介绍同步客户端的使用。

2.从旧版High Level Rest Client迁移值新版

两种客户端可以同时存在,自行选择使用

// 低级客户端
RestClient httpClient = RestClient.builder(
    new HttpHost("localhost", 9200)
).build();

//创建旧版旧版High Level Rest Client
RestHighLevelClient hlrc = new RestHighLevelClientBuilder(httpClient)
    .setApiCompatibilityMode(true) 
    .build();

// 创建新版ElasticsearchClient 
ElasticsearchTransport transport = new RestClientTransport(
    httpClient,
    new JacksonJsonpMapper()
);
ElasticsearchClient esClient = new ElasticsearchClient(transport);

2.Lambda表达式相关api的使用

创建索引

    @Test
    public void createIndex() throws IOException {
        ElasticsearchClient client = getElasticsearchClient();
        System.out.println("连接成功--------------------------");
        CreateIndexResponse createIndexResponse = client.indices().create(
                index ->
                        index.index("productlist").aliases("product" , aliase ->
                                aliase.isWriteIndex(true))
        );

        System.out.println(createIndexResponse.toString());

    }

写入单个文档

实体类

public class Product implements Serializable {
    private static final long serialVersionUID = 1L;
    private String no;
    private String name;
    private String createBy;

    public Product() {
    }

    public Product(String no, String name, String createBy) {
        this.no = no;
        this.name = name;
        this.createBy = createBy;
    }

    public String getNo() {
        return no;
    }

    public void setNo(String no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCreateBy() {
        return createBy;
    }

    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }

    @Override
    public String toString() {
        return "Product{" +
                "no='" + no + '\'' +
                ", name='" + name + '\'' +
                ", createBy='" + createBy + '\'' +
                '}';
    }
}
Product product = new Product("bk-1", "City bike", 123.0);

IndexResponse response = esClient.index(i -> i
    .index("products")
    .id(product.getSku())
    .document(product)
);

批量插入

 @Test
    public void bulkInsertDocument() throws IOException {
        ElasticsearchClient client = getElasticsearchClient();
        System.out.println("连接成功--------------------------");
        List<Product> products = new ArrayList<>();
        products.add(new Product("asdad","dasdasd","adasdasdad"));
        products.add(new Product("12313","453","sfsdfdsfdsf"));

        BulkRequest.Builder br = new BulkRequest.Builder();

        for (Product product : products) {
            br.operations(
                    op -> op.index(index -> index
                            .index("productlist").document(product))
            );
        }

        BulkResponse bulk = client.bulk(br.build());
        System.out.println(bulk);
    }

通过id查找文档

    @Test
    public void getOne() throws IOException {
        ElasticsearchClient client = getElasticsearchClient();
        System.out.println("连接成功--------------------------");
        GetResponse<Product> response = client.get(g -> g
                        .index("productlist")
                        .id("7ROTUIEBMxTIVL_J85rw"),
                Product.class
        );
        System.out.println(response.source());
    }

搜索文档

String searchText = "bike";

SearchResponse<Product> response = esClient.search(s -> s
    .index("productlist") 
    .query(q -> q      
        .match(t -> t   
            .field("name")  
            .query(searchText)
        )
    ),
    Product.class      
);

TotalHits total = response.hits().total();
boolean isExactResult = total.relation() == TotalHitsRelation.Eq;

if (isExactResult) {
    logger.info("There are " + total.value() + " results");
} else {
    logger.info("There are more than " + total.value() + " results");
}

List<Hit<Product>> hits = response.hits().hits();
for (Hit<Product> hit: hits) {
    Product product = hit.source();
    logger.info("Found product " + product.getSku() + ", score " + hit.score());
}

聚合文档

String searchText = "bike";

Query query = MatchQuery.of(m -> m
    .field("name")
    .query(searchText)
)._toQuery();

SearchResponse<Void> response = esClient.search(b -> b
    .index("products")
    .size(0) 
    .query(query) 
    .aggregations("price-histogram", a -> a 
        .histogram(h -> h 
            .field("price")
            .interval(50.0)
        )
    ),
    Void.class 
);

总结

以上就是这篇要讲的内容,更多详细用法参考官网文档https://www.elastic.co/guide/en/elasticsearch/client/java-api-client/current/index.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐