一、安装ElasticSearch
1、阿里云申请试用版本的ElasticSearch【7.10.0】(需要花钱1块钱),使用时间1个月。
版本说明
2、自己百度安装一个本地版本,我真的不喜欢运维事情【我太废材,无法快速部署】。
二、ElasticSearch,jar包
在pom.xml里加入如下依赖
<spring.boot.version>3.0.1</spring.boot.version>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>${spring.boot.version}</version>
</dependency>
以下例子使用版本:
| jar | 版本 |
|---|---|
| elasticsearch | 7.17.7 |
| spring boot | 3.0.1 |
| java | 17 |
三、客户端定义
package com.nice.framework.config;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import org.apache.http.Header;
import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.message.BasicHeader;
import org.elasticsearch.client.RestClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @description: ElasticSearch
* @author: nice
* @created: 2022/12/29 10:13
*/
@Configuration
public class ElasticSearchClientConfig {
public final String username = "elastic";
public final String password = "########";
public final String hostname = "es-cn-tl330texc001lmavp.public.elasticsearch.aliyuncs.com";
public final Integer port = 9200; // 默认端口号
public final String scheme = "http"; // 协议
@Bean
public RestClient getRestClient() {
// 创建用户名密码认证
final CredentialsProvider credentialsProvider =
new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY,
new UsernamePasswordCredentials(username, password));
Header[] defaultHeaders = new Header[]{new BasicHeader("Content-Type", "application/json")};
// Header[] defaultHeaders = new Header[]{new BasicHeader("Content-Type", "application/x-www-form-urlencoded")};
// 使用 low level rest client 进行连接和认证
return RestClient.builder(
new HttpHost(hostname, port, scheme)
).setHttpClientConfigCallback(httpAsyncClientBuilder ->
httpAsyncClientBuilder.setDefaultCredentialsProvider(
credentialsProvider)
).setDefaultHeaders(defaultHeaders)
.build();
}
@Bean
public ElasticsearchTransport getElasticsearchTransport() {
// 使用 transport 加载 json 的对象映射器
return new RestClientTransport(getRestClient(),
new JacksonJsonpMapper());
}
@Bean
public ElasticsearchClient getElasticsearchClient() {
// 创建操作用的 ElasticsearchClient 对象
return new ElasticsearchClient(getElasticsearchTransport());
}
}
四、基本用法:
@Autowired
private ElasticsearchClient elasticsearchClient;
@GetMapping
public AjaxResult testCreateIndex() throws IOException {
//1.创建索引请求
CreateIndexResponse re = elasticsearchClient.indices()
.create(item -> item.index("nice-001"));
String str = String.valueOf(re.acknowledged());
return AjaxResult
.success(str);
}
异常2: [es/indices.create] failed: [resource_already_exists_exception] index [nice-0011/M6XTHvKJRIyvEGn3xymSBQ] already exists
原因:重复添加索引。
异常1: [es/indices.create] Missing [X-Elastic-Product] header. Please check that you are connecting to an Elasticsearch instance, and that any networking filters are preserving that header.
说明: 虽然异常,但是索引已经添加到es内。
等下阿里云出8.0+ 版本在继续demo