在整合ElasticSearch之前,先声明这次整合是根据狂神的视频学习整合的,对我来说是学习的笔记,也分享一下整个的步骤,后面会附上狂神视频链接!
我使用的ES版本是:windows 的 ES:7.9.1
关于ES和head下载安装先不做介绍!
我们想一想,整合ES是通过什么来进行操作连接的?是不是通过某一个客户端来连接ES服务端进行操作呀,那客户端怎么编写?
选择文档
找到ElasticSearch Clients,这个位置就是介绍有哪些客户端可以进行连接ES
那么我们点进去看一下,发现有多种连接方式,我们选择第一个的可以了
再次点进去,选择高级客户端来进行操作
再点,可以针对文档来进行学习哦,那么我英语水平比较低,看不懂,哈哈
那么我们一般在创建springboot整合ES的使用都会去找到相关的依赖,那么去哪里找呢??
选择Geting started,找到Maven Reposity
找到Maven configuration,这里就是依赖啦
我们点击Initialization,看看怎么初始化
到这里我们就差不多开始创建项目,进行代码的编写啦。
我这里只选择 Spring Data Elastissearch(Access + Driver),其它先不选了,毕竟我只做测试。最后就下一步,完成就可以 了
1.8
org.springframework.boot
spring-boot-starter-data-elasticsearch
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
继续点进去
往下翻可以找到已经集成了高版本的客户端的依赖
1.8
7.9.1
org.springframework.boot
spring-boot-starter-data-elasticsearch
com.alibaba
fastjson
1.2.62
org.springframework.boot
spring-boot-starter-test
test
org.junit.vintage
junit-vintage-engine
@Configuration
public class ElasticSearchClientConfig {
@Bean
public RestHighLevelClient restHighLevelClient(){
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("127.0.0.1", 9200, "http")));
return client;
}
}
浏览器访问head
这里注意的是,如果你觉得定义的客户端变量名太长,可以自己更改,但会报错,将@Autowired注解改为@Resource就好
//测试索引的创建 Request
@Test
void testCreateIndex() throws IOException {
//1. 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("jack_index");
//2. 客户端执行请求,请求后,获得响应
CreateIndexResponse response = restHighLevelClient.indices()
.create(request, RequestOptions.DEFAULT);
System.out.println(response);
}
运行,在head中查看有没有创建成功,有就代表成功
//测试判断索引是否存在
@Test
void testExistIndex() throws IOException {
//1. 获取索引请求
GetIndexRequest request = new GetIndexRequest("jack_index");
boolean exists = restHighLevelClient.indices()
.exists(request, RequestOptions.DEFAULT);
if(exists){
System.out.println("获取的索引存在");
}else{
System.out.println("获取的索引不存在");
}
}
测试不存在的索引试试
//测试删除索引
@Test
void testDeleteIndex() throws IOException {
//1. 获取删除索引请求
DeleteIndexRequest request = new DeleteIndexRequest("jack_index");
//2. 客户端执行请求,返回响应结果
AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
System.out.println(response.isAcknowledged());
}
看一下head,看索引是否删除成功,刷新一下浏览器
之前我把索引给 删除掉了,我在重新创建回来
我们创建一个User对象,用来测试将对象存入ES中
在entity创建一个User类
public class User {
private String name;
private Integer age;
private String sex;
public User(String name, Integer age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
//getter setter toString....
}
编写测试
//测试添加文档
@Test
void testAddDocument() throws IOException {
//1. 创建对象
User user = new User("jack", 23, "男");
//2. 创建请求
IndexRequest jack_index = new IndexRequest("jack_index");
//3. 规则 PUT /jack_index/_doc/1
//不指定类型,默认类型是_doc
jack_index.id("1");//文档id
jack_index.timeout(TimeValue.timeValueSeconds(1)); //设置超时时间
//4. 将数据放入请求 JSON
jack_index.source(JSON.toJSONString(user), XContentType.JSON);
//5. 客户端发送请求, 获取响应结果
IndexResponse response = restHighLevelClient
.index(jack_index, RequestOptions.DEFAULT);
System.out.println(response.toString());//信息返回
System.out.println(response.status());//命令返回状态
}
运行
可以看到数据添加成功
//测试判断文档是否存在
@Test
void testIsExists() throws IOException {
GetRequest jack_index = new GetRequest("jack_index", "1");
//不获取返回的 _source的上下文
jack_index.fetchSourceContext(new FetchSourceContext(false));
jack_index.storedFields("_none_");
boolean exists = restHighLevelClient.exists(jack_index, RequestOptions.DEFAULT);
System.out.println(exists);
}
我们可以进到GetRequest这一个类里面去看一下
看到了没有,它默认指定了索引的类型
不理了,我先运行
//测试获取某一个文档信息
@Test
void testGetDocument() throws IOException {
GetRequest jack_index = new GetRequest("jack_index", "1");
GetResponse response = restHighLevelClient.get(jack_index, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString()); //打印文档的内容
System.out.println(response); //返回的全部内容和命令一样的
}
//测试更新文档信息
@Test
void testUpdateDocument() throws IOException {
//获取更新请求
UpdateRequest updateRequest = new UpdateRequest("jack_index", "1");
//设置更新超时时间
updateRequest.timeout("1s");
User user = new User("小杰", 22, "男");
updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);
//执行
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());//这个是状态
}
运行,到浏览器去查看
返回的状态信息
//测试删除文档
@Test
void testDeleteDocument() throws IOException {
//获取删除请求
DeleteRequest deleteRequest = new DeleteRequest("jack_index", "1");
//设置删除超时时间
deleteRequest.timeout("1s");
//执行
DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(delete.status());
}
运行
//特殊情况,批量插入数据
@Test
void testBulkRequest() throws IOException {
//通过BulkRequest来进行批量操作
BulkRequest bulkRequest = new BulkRequest();
bulkRequest.timeout("10s");
List users = new ArrayList<>();
users.add(new User("张三", 16, "男"));
users.add(new User("李四", 25, "男"));
users.add(new User("王五", 30, "男"));
users.add(new User("王昭君", 20, "男"));
users.add(new User("貂蝉", 22, "男"));
Integer i = 1;
for(User user : users){
bulkRequest.add(new IndexRequest("jack_index")
.id((i++).toString())
.source(JSON.toJSONString(user),XContentType.JSON));
}
//批处理
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures()); //是否失败,返回false代表成功
}
运行
我这里是查询含有王的名字都给查询出来
//测试查询
@Test
void testSearch() throws IOException {
//1. 获取搜索请求
SearchRequest jack_index = new SearchRequest("jack_index");
//2. 构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//设置查询条件 (查询名字含有王的User),使用QueryBuilders快速精确匹配
TermQueryBuilder termQuery = QueryBuilders.termQuery("name", "王");
sourceBuilder.query(termQuery);
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
jack_index.source(sourceBuilder);//搜索请求执行的搜索条件,装载
//3. 执行
SearchResponse search = restHighLevelClient.search(jack_index, RequestOptions.DEFAULT);
//System.out.println(JSON.toJSONString(search.getHits().getHits()));
//遍历 查询的结果会封装到getHits中
for(SearchHit documentFields : search.getHits()){
System.out.println(documentFields.getSourceAsMap());
}
}
//测试全部查询
@Test
void testQueryAll() throws IOException {
//1. 获取搜索请求
SearchRequest searchRequest = new SearchRequest("jack_index");
//2. 构建搜索条件
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//设置查询条件 matchAllQuery查询所有文档
MatchAllQueryBuilder allQuery = QueryBuilders.matchAllQuery();
sourceBuilder.query(allQuery);
searchRequest.source(sourceBuilder);//搜索请求执行的搜索条件,装载
//3. 执行
SearchResponse search = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//遍历 查询的结果会封装到getHits中
for(SearchHit documentFields : search.getHits()){
System.out.println(documentFields.getSourceAsMap());
}
}
成功