1、找到原生的依赖
org.elasticsearch.client
elasticsearch-rest-high-level-client
7.6.2
2、找对象
3、分析这个类中的方法即可
配置基本的项目
问题:一定要保证 我们的导入的依赖和我们的es 版本一致
源码中提供对象
虽然这里导入3个类,静态内部类,核心类就一个
/**
* Elasticsearch rest client infrastructure configurations.
*
* @author Brian Clozel
* @author Stephane Nicoll
*/
class RestClientConfigurations {
@Configuration(proxyBeanMethods = false)
static class RestClientBuilderConfiguration {
// RestClientBuilder
@Bean
@ConditionalOnMissingBean
RestClientBuilder elasticsearchRestClientBuilder(RestClientProperties
properties,
ObjectProvider builderCustomizers) {
HttpHost[] hosts =
properties.getUris().stream().map(HttpHost::create).toArray(HttpHost[]::new);
RestClientBuilder builder = RestClient.builder(hosts);
PropertyMapper map = PropertyMapper.get();
map.from(properties::getUsername).whenHasText().to((username) -> {
CredentialsProvider credentialsProvider = new
BasicCredentialsProvider();
Credentials credentials = new
UsernamePasswordCredentials(properties.getUsername(),
properties.getPassword());
credentialsProvider.setCredentials(AuthScope.ANY, credentials);
builder.setHttpClientConfigCallback(
(httpClientBuilder) ->
httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider));
});
builder.setRequestConfigCallback((requestConfigBuilder) -> {
map.from(properties::getConnectionTimeout).whenNonNull().asInt(Duration::toMill
is)
.to(requestConfigBuilder::setConnectTimeout);
map.from(properties::getReadTimeout).whenNonNull().asInt(Duration::toMillis)
.to(requestConfigBuilder::setSocketTimeout);
return requestConfigBuilder;
});
builderCustomizers.orderedStream().forEach((customizer) ->
customizer.customize(builder));
return builder;
}
}
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(RestHighLevelClient.class)
static class RestHighLevelClientConfiguration {
// RestHighLevelClient 高级客户端,也是我们这里要讲,后面项目会用到的客户端
@Bean
@ConditionalOnMissingBean
RestHighLevelClient elasticsearchRestHighLevelClient(RestClientBuilder
restClientBuilder) {
return new RestHighLevelClient(restClientBuilder);
}
@Bean
@ConditionalOnMissingBean
RestClient elasticsearchRestClient(RestClientBuilder builder,
ObjectProvider restHighLevelClient) {
RestHighLevelClient client = restHighLevelClient.getIfUnique();
if (client != null) {
return client.getLowLevelClient();
}
return builder.build();
}
}
@Configuration(proxyBeanMethods = false)
static class RestClientFallbackConfiguration {
// RestClient 普通的客户端!
@Bean
@ConditionalOnMissingBean
RestClient elasticsearchRestClient(RestClientBuilder builder) {
return builder.build();
}
}
}
ElasticSearch客户端配置类
核心就是1、找对象 2、放到 spring 中待用
package com.jia.config;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http"))); //绑定本地的地址(可绑定多个)
return client;
}
}
测试创建索引
@Autowired
private RestHighLevelClient restHighLevelClient;
// 测试创建索引
@Test
void test1() throws IOException {
// 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("jia_index");
// 客户端执行请求 IndicesClient,请求后获得响应
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
测试获取索引
// 测试获取索引
@Test
void test2() throws IOException {
GetIndexRequest request = new GetIndexRequest("jia_index");
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
// 测试删除索引
@Test
void test3() throws IOException {
DeleteIndexRequest request = new DeleteIndexRequest("jia_index");
AcknowledgedResponse delete = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
创建实体类
package com.jia.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.stereotype.Component;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
private String name;
private int age;
}
测试添加文档
// 测试添加文档
@Test
void test4() throws IOException {
// 创建对象
User user = new User("贾宇光", 13);
// 创建请求
IndexRequest request = new IndexRequest("jia_index");
// 规则 PUT /jia_index/_doc/1
request.id("1");
request.timeout(TimeValue.timeValueSeconds(1));
//request.timeout("1s");
// 将数据放入请求中 json
request.source(JSON.toJSONString(user), XContentType.JSON);
// 客户端发送请求,获取响应的结果
IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
System.out.println(indexResponse.toString()); //查看结果
System.out.println(indexResponse.status()); //查看状态
}
获取文档,判断是否存在
// 获取文档,判断是否存在
@Test
void test5() throws IOException {
GetRequest request = new GetRequest("jia_index", "1");
// 不获取返回的 _source 的上下文了
request.fetchSourceContext(new FetchSourceContext(false));
request.storedFields("_none_");
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
System.out.println(exists);
}
获取文档
// 获取文档
@Test
void test6() throws IOException {
GetRequest request = new GetRequest("jia_index", "1");
GetResponse documentFields = restHighLevelClient.get(request, RequestOptions.DEFAULT);
System.out.println(documentFields.getSourceAsString()); // 打印结果为 String 类型
System.out.println(documentFields.getSourceAsMap()); // 打印结果为 Map 类型
System.out.println(documentFields); // 直接打印查询结果
}
更新文档信息
// 更新文档信息
@Test
void test7() throws IOException {
UpdateRequest request = new UpdateRequest("jia_index", "1");
request.timeout("1s");
User user = new User("小羊羊", 111);
request.doc(JSON.toJSONString(user), XContentType.JSON);
UpdateResponse update = restHighLevelClient.update(request, RequestOptions.DEFAULT);
System.out.println(update.status());
}
删除文档信息
// 删除文档信息
@Test
void test8() throws IOException {
DeleteRequest request = new DeleteRequest("jia_index", "1");
request.timeout("1s");
DeleteResponse delete = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
System.out.println(delete.status());
}
批量插入数据
// 批量插入数据
@Test
void test9() throws IOException {
BulkRequest request = new BulkRequest();
request.timeout("10s");
ArrayList userList = new ArrayList<>();
userList.add(new User("贾宇光1", 111));
userList.add(new User("贾宇光2", 222));
userList.add(new User("贾宇光3", 333));
userList.add(new User("贾宇光4", 444));
userList.add(new User("贾宇光5", 555));
userList.add(new User("贾宇光6", 666));
// 批处理请求
for (int i = 0; i < userList.size(); i++) {
// 批量添加文档
request.add(new IndexRequest("jia_index")
.id("" + (i + 1))
.source(JSON.toJSONString(userList.get(i)), XContentType.JSON));
// 批量删除文档
// DeleteRequest deleteRequest = new DeleteRequest("jia_index", ""+(i+1));
// request.add(deleteRequest);
}
BulkResponse bulk = restHighLevelClient.bulk(request, RequestOptions.DEFAULT);
System.out.println(bulk.hasFailures());
}
查询(精确匹配、匹配所有)
// 查询
// SearchRequest 搜索请求
// SearchSourceBuilder 条件构造
// 最后提交请求
@Test
void test10() throws IOException {
SearchRequest request = new SearchRequest("jia_index");
// 构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
// 精确匹配
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "贾宇光");
// 匹配所有
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
// 设置查询条件
sourceBuilder.query(termQueryBuilder);
// 设置分页
// sourceBuilder.from(0);
// sourceBuilder.size(2);
// 设置超时
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
request.source(sourceBuilder);
SearchResponse search = restHighLevelClient.search(request, RequestOptions.DEFAULT);
System.out.println("=====================================================");
System.out.println(JSON.toJSONString(search.getHits()));
System.out.println("=====================================================");
for (SearchHit documentFields : search.getHits().getHits()) {
System.out.println(documentFields.getSourceAsMap());
}
System.out.println("=====================================================");
}