Elasticsearch 7.16.x Java 开发之项目搭建

Elasticsearch 7.16.x Java 开发之项目搭建

一、背景概述

公司升级 ES 库版本,从 5.x 升至 7.16,然后就有了今天的故事…

二、Java Rest Client

  • Java Low Level Rest Client:低级别客户端,允许通过 HTTP 请求与 ES 集群进行通信,封装度低但无视 ES 版本。
  • Java High Level Rest Client:高级别客户端,基于低级别客户端封装。

Java Low Level Rest Client

官网地址:Java Low Level REST Client

相关依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-client</artifactId>
    <version>7.16.2</version>
</dependency>

代码示例

public RestClient getClient() {
    // ES 连接信息
    HttpHost[] hosts = {new HttpHost("localhost", 9200, "http")};
    // 如果有密码,设置身份认证
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elasticsearch", "123456"));
    // 创建 LOW-LEVEL-CLIENT 连接
    return RestClient.builder(hosts)
            .setRequestConfigCallback(requestConfigBuilder -> requestConfigBuilder
                    // 统一设置 REQUEST 请求,也可以分别设置每个 REQUEST 请求,见方法 getSpecialRequest()
                    .setConnectTimeout(6000)
                    .setSocketTimeout(6000)
            )
            .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                    // 设置身份认证
                    .setDefaultCredentialsProvider(credentialsProvider)
                    // 设置线程数
                    .setDefaultIOReactorConfig(IOReactorConfig.custom().setIoThreadCount(6).build())
            )
            .build();
}

/**
 * 单独设置 REQUEST 请求
 */
public Request getSpecialRequest(Request request) {
    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(6000)
            .setSocketTimeout(6000).build();
    RequestOptions options = RequestOptions.DEFAULT.toBuilder().setRequestConfig(requestConfig).build();
    request.setOptions(options);
    return request;
}

测试一下~

/**
 * @param myIndex 索引库库名
 */
public void test(String myIndex) {
    RestClient lowLevelClient = getClient();
    Request request = new Request("POST", "/" + myIndex + "/_search");
    request.setEntity(new StringEntity("{'query':{'match':{'title':'ES'}}}", StandardCharsets.UTF_8));
    Response response = lowLevelClient.performRequest(request);
    HttpEntity entity = response.getEntity();
    String result = EntityUtils.toString(entity, StandardCharsets.UTF_8);
    return JSON.parseObject(result);
}

Java High Level Rest Client

官网地址:Elasticsearch Java API Client

相关依赖

<dependency>
    <groupId>co.elastic.clients</groupId>
    <artifactId>elasticsearch-java</artifactId>
    <version>7.16.2</version>
</dependency>
<!-- 这个依赖官方文档给的是 2.12.3,但我 Class/Method Not Found -->
<!-- 大胆猜测一下,官方写错了~ -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.11.2</version>
</dependency>
<!-- 大胆猜测一下,官方写错了~ -->
<!-- 这个依赖官方文档给的是 2.12.3,但我 Class/Method Not Found -->
<!-- 这个依赖官方文档没写,Class/Method Not Found 的同志可以加上这个试试 -->
<dependency>
    <groupId>jakarta.json</groupId>
    <artifactId>jakarta.json-api</artifactId>
    <version>2.0.1</version>
</dependency>
<!-- 这个依赖官方文档没写,Class/Method Not Found 的同志可以加上这个试试  -->

另外,如果项目本身是 Spring Boot 项目,需额外注意,Spring 是否声明了其他版本的 ES,Spring Data也是整了 ES 的,别问我为什么不用,问就是那个版本太低不好使。我在这个坑里躺了 N 久…闻者伤心见者流泪…

<properties>
    <elasticsearch.version>7.16.2</elasticsearch.version>
</properties>

代码示例

public ElasticsearchClient getClient() {
    // ES 连接信息
    HttpHost[] hosts = {new HttpHost("localhost", 9200, "http")};
    // 如果有密码,设置身份认证
    final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "123456"));
    // 创建 LOW-LEVEL-CLIENT 连接
    RestClient lowLevelClient = RestClient.builder(hosts)
            // 设置身份认证
            .setHttpClientConfigCallback(httpClientBuilder -> httpClientBuilder
                    .setDefaultCredentialsProvider(credentialsProvider))
            .build();
    ElasticsearchTransport transport = new RestClientTransport(lowLevelClient, new JacksonJsonpMapper());
    ElasticsearchClient client = new ElasticsearchClient(transport);
    return client;
}

测试一下~

/**
 * @param myIndex 索引库库名
 */
public void test(String myIndex) {
    ElasticsearchClient highLevelClient = getClient();
    SearchResponse<MyEntity> search = highLevelClient.search(searchRequest -> searchRequest
                    .index(myIndex)
                    .query(query -> query.term(term -> term.field("title").value(value -> value.stringValue("ES")))),
            MyEntity.class);
    for (Hit<MyEntity> hit : search.hits().hits()) {
        log.info(hit.source().toString());
    }
}

到此结束~~~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值