(此系列内容来自狂神说视频)
上一篇创建了springBoot项目,也勾选了一些需要的jar包,这篇主要讲一下使用springboot进行es api的调用。
首先是, 先将esclient的对象交给spring管理,所以创建配置类
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;
//spring 两步骤
//1 找对象
//2 放入spring中待用
//3.如果是springBoot 先分析源码
//所有的自动配置叫xxx AutoConfiguration 配置类叫xxxProperties
@Configuration //xml
public class ElasticSearchClientConfig {
//spring <beans id="方法名" class="返回值">
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
return client;
}
这里可以去看spring-autoconfigure包下找到spring封装的es,一个是data包下的es(我这里的springboot版本是2.5.0)
另有一个就是跟data并列的es
具体这个源码的关系,我还没搞清楚
第二步、下面写下测试类的代码
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
@SpringBootTest
class EsApiApplicationTests {
@Autowired
private RestHighLevelClient client;
//测试索引创建
@Test
void contextLoads() throws IOException {
//1.创建索引请求
CreateIndexRequest indexRequest = new CreateIndexRequest("course");
//2.客户端执行请求
CreateIndexResponse createIndexResponse = client.indices().create(indexRequest, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
}
然后执行
第三步、去es head里看下有没有创建成功,发现有的,成功了
具体的api测试
1.创建索引
2.判断索引是否存在
3.删除索引
4.创建文档
5.crud文档
上面刚刚写了创建索引的测试,下面写下查询和删除索引的测试类
//测试获取索引
@Test
void testGetIndex() throws IOException {
//1.创建索引请求
GetIndexRequest getIndexRequest = new GetIndexRequest("course1");
//2.客户端执行请求
boolean exists = client.indices().exists(getIndexRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
//测试删除索引
@Test
void testDeleteIndex() throws IOException {
//1.创建索引请求
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("course");
//2.客户端执行请求
AcknowledgedResponse delete = client.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
下面是关于文档的测试
//测试添加文档
@Test
void testAddDocument() throws IOException {
//1.创建对象
User judy = new User("judy", 12);
//2.创建索引请求
IndexRequest indexRequest = new IndexRequest("customer");
//3.设置规则
indexRequest.id("1").timeout(TimeValue.timeValueSeconds(1));
//4.将我们的数据放进请求
indexRequest.source(JSON.toJSONString(judy), XContentType.JSON);
//5.客户端发送请求,获取响应结果
IndexResponse index = client.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(index.toString());
System.out.println(index.status());
}
//测试获取文档,判断是否存在
@Test
void testIsExists() throws IOException {
GetRequest getRequest = new GetRequest("customer", "1");
//不获取但会的_source的上下文了
getRequest.fetchSourceContext(new FetchSourceContext(false));
getRequest.storedFields("name");
boolean exists = client.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);
}
//测试获取文档信息
@Test
void testGetDocument() throws IOException {
GetRequest getRequest = new GetRequest("customer", "1");
//不获取但会的_source的上下文了
// getRequest.fetchSourceContext(new FetchSourceContext(false));
GetResponse documentFields = client.get(getRequest, RequestOptions.DEFAULT);
System.out.println(documentFields);//返回全部的内容,跟命令式是一样的
System.out.println(documentFields.getSourceAsString());//打印文档的内容
}
//更新文档信息
@Test
void testUpdateDocument() throws IOException {
UpdateRequest updateRequest = new UpdateRequest("customer", "1");
updateRequest.timeout("1s");
User lily = new User("lily2");
updateRequest.doc(JSON.toJSONString(lily),XContentType.JSON);
//不获取但会的_source的上下文了
UpdateResponse update = client.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(update);//返回全部的内容,跟命令式是一样的
System.out.println(update.status());//打印文档的内容
}
//删除文档请求
@Test
void testDeleteRequest() throws IOException {
DeleteRequest deleteRequest = new DeleteRequest("customer", "1");
deleteRequest.timeout("1s");
DeleteResponse delete = client.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(delete);
System.out.println(delete.status());
}
//特殊的,真的项目一般会批量插入数据
@Test
void testBulkRequest() throws IOException {
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
ArrayList<User> userList =new ArrayList<>();
//批处理请求
for (int i = 0; i <10; i++) {
//批量更新和批量删除就在这里修改即可
bulkRequest.add(new IndexRequest("customer").id(String.valueOf(i+1)).//不写id会默认生成随机id
source(JSON.toJSONString(new User("钱江"+i+"号",10+i)),XContentType.JSON));
}
BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());//是否失败,返回false代表成功
}
//特殊的,真的项目一般会批量插入数据
//特殊的,真的项目一般会批量插入数据
//SearchRequest 搜索请求
//SearchSourceBuilder 条件构造
//HighLightBuilder 构建高亮
//TermQueryBuilder 精确查询,中文需要字段.keyword
//xxx QueryBuilder 对应我们刚刚看到的命令
@Test
void testSearch() throws IOException {
SearchRequest searchRequest =new SearchRequest("customer");
//构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//查询条件,我们可以使用QueryBuilders工具来实现
// MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery(); //这个是匹配所有查询
//以为string类型默认是es的text,term直接查出不来,加上.keyword就可以了,或者手动设置name的类型,添加上keyword类型
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name.keyword","钱江2号");
sourceBuilder.query(termQueryBuilder);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
searchRequest.source(sourceBuilder);
SearchResponse search= client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(JSON.toJSONString(search.getHits()));
System.out.println("===================================");
search.getHits().forEach(hit->{
System.out.println(hit.getSourceAsMap());
});
}