06-springBoot集成Elasticsearch

1 官方参考

官网文档参考地址: https://www.elastic.co/guide/index.html

在这里插入图片描述

在这里插入图片描述

注:我们一般使用Java REST Client,并且使用高级的。 https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/index.html

1.1 引入依赖

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.9.0</version>
</dependency>

在这里插入图片描述

在这里插入图片描述

1.2 初始化操作

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));

在这里插入图片描述

注:客户端用完后需要关闭客户端。

1.3 根据API使用客户端操作elasticsearch

在这里插入图片描述

2 搭建基础测试环境

2.1 创建springboot项目

<properties>
    <java.version>1.8</java.version>
    <!-- 自己定义的ES版本要和本地保持一致 -->
    <elasticsearch.version>7.6.1</elasticsearch.version>
</properties>

<!-- 引入ES依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注:spring-boot-starter-data-elasticsearch依赖实际是通过依赖spring-data-elasticsearch,而spring-data-elasticsearch最底层还是依赖org.elasticsearch.client和elasticsearch-rest-high-level-client两个版本的客户端来操作ES。

特别注意:项目中elasticsearch版本和使用的elasticsearch版本要一致,如果不一致则需要改成一致的。

2.2 配置注入ES

package com.example.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(){
        //如果是集群,则构建多个HttpHost对象
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(new HttpHost("127.0.0.1", 9200, "http")));
        return client;
    }
}

注:这里我们不使用SpringBoot封装的ElasticsearchRestTemplate对象,若使用此对象需在application.yml中配置ES相关配置。

在这里插入图片描述

在spring-boot-autoconfigure的jar包中ES有两种类型的客户端配置属性参数,如上图所示。其中默认配置如下图所示

在这里插入图片描述

2.3 编写测试代码

package com.example;

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 ElasticsearchApiApplicationTests {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    @Test
    void testCreateIndex() throws IOException {
        //1. 创建索引请求
        CreateIndexRequest request = new CreateIndexRequest("test01");
        //2. 客户端执行请求 IndicesClient,并获取响应信息
        CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
        System.out.println("响应信息:" + createIndexResponse);
    }

}

在这里插入图片描述

在这里插入图片描述

注:执行成功,索引创建成功,测试环境搭建成功!

3 客户端调用示例详解

3.1 索引API操作示例

3.1.1 创建索引
//1. 创建索引请求
CreateIndexRequest request = new CreateIndexRequest("test02");
//2. 客户端执行请求 IndicesClient,并获取响应信息
CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
ObjectMapper objectMapper = new ObjectMapper();

//输出结果:{"acknowledged":true,"shardsAcknowledged":true,"fragment":false}
System.out.println(objectMapper.writeValueAsString(createIndexResponse));
3.1.2 获取索引
//1. 创建获取索引请求
GetIndexRequest getIndexRequest = new GetIndexRequest("test02");
//2. 判断索引是否存在
boolean exists = restHighLevelClient.indices().exists(getIndexRequest, RequestOptions.DEFAULT);

//输出结果:true
System.out.println(exists);
3.1.3 删除索引
//1. 创建删除索引请求
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("test02");
//2. 执行删除操作,并返回删除结果
AcknowledgedResponse delete = restHighLevelClient.indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);

//输出结果:是否删除成功 true-成功
System.out.println(delete.isAcknowledged());

3.2 文档API操作示例

3.2.1 添加文档
//添加用户类
package com.example.bean;

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;

}

//测试
//1. 创建用户对象
User user = new User("张三",12);
//2. 创建索引请求
IndexRequest indexRequest = new IndexRequest("test01");
//3. 设置规则:PUT /test01/_doc/1)
indexRequest.id("1");//设置ID
indexRequest.timeout(TimeValue.timeValueSeconds(1));//设置过期时间1S
//4. 将数据放入请求,数据为JSON字符串
ObjectMapper objectMapper = new ObjectMapper();
indexRequest.source(objectMapper.writeValueAsString(user), XContentType.JSON);
//5. 客户端发送请求
IndexResponse indexResponse = restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
System.out.println(indexResponse.status());//对应命令返回的状态(CREATED-创建)
System.out.println(indexResponse.toString());

在这里插入图片描述

3.2.2 获取文档
//1. 创建获取请求 GET /test01/_doc/1
GetRequest getRequest = new GetRequest("test01", "1");
//2. 设置不获取返回的_score的上下文,提高效率(非必需)
//getRequest.fetchSourceContext(new FetchSourceContext(false));
//3. 设置排序字段(非必需)
//getRequest.storedFields("_none_");
//4. 判断是否存在
boolean exists = restHighLevelClient.exists(getRequest, RequestOptions.DEFAULT);
System.out.println(exists);//true
//5. 获取文档内容信息
GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
System.out.println(getResponse.getSourceAsString());//{"name":"张三","age":12}
3.2.3 更新文档
//1. 创建更新请求 PUT /test01/_doc/1
UpdateRequest updateRequest = new UpdateRequest("test01","1");
//2. 创建User对象数据
User user = new User("李四", 13);
ObjectMapper objectMapper = new ObjectMapper();
updateRequest.doc(objectMapper.writeValueAsString(user), XContentType.JSON);
//3. 执行变更,获取响应结果
UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
System.out.println(updateResponse.status());//OK-执行成功
3.2.4 删除文档
//1. 创建删除请求
DeleteRequest deleteRequest = new DeleteRequest("test01","1");
//2. 设置超时时间
deleteRequest.timeout("1s");
//3. 执行删除请求
DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
System.out.println(deleteResponse.status());//OK-删除成功

在这里插入图片描述

3.2.5 批量插入文档数据
//1. 创建批量操作请求
BulkRequest bulkRequest = new BulkRequest();
//2. 创建批量操作数据
ArrayList<User> userList = new ArrayList<>();
userList.add(new User("ceshi1", 12));
userList.add(new User("ceshi2", 13));
userList.add(new User("ceshi3", 15));
userList.add(new User("ceshi4", 22));
//3. 设置批量操作
ObjectMapper objectMapper = new ObjectMapper();
for (int i = 0; i < userList.size(); i++) {
    bulkRequest.add(
        new IndexRequest("test01")
        .id("" + (i + 1))
        .source(objectMapper.writeValueAsString(userList.get(i)), XContentType.JSON)
    );
}
//4. 执行请求
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
System.out.println(bulkResponse.hasFailures());//false-是否失败,false表示执行成功

在这里插入图片描述

3.3 查询操作(*)

3.3.1 简单查询
//1. 创建查询请求
SearchRequest searchRequest = new SearchRequest("test01");
//2. 构建搜索条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//3. 构建查询构造器,使用QueryBuilders能够快速匹配创建查询
//termQuery:精确匹配
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "ceshi1");
sourceBuilder.query(termQueryBuilder);
//4. 将搜索条件构造器放入请求
searchRequest.source(sourceBuilder);
//5. 查询数据
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//通过getHits来获取查询结果数据
ObjectMapper objectMapper = new ObjectMapper();
System.out.println(objectMapper.writeValueAsString(searchResponse.getHits()));

在这里插入图片描述

3.3.2 分页查询
//1. 创建查询请求
SearchRequest searchRequest = new SearchRequest("test01");
//2. 构建搜索条件构造器
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//4. 添加分页参数,form表示从第几条数据开始,size表示查询多少条数据
sourceBuilder.from(0).size(2);
//4. 将搜索条件构造器放入请求
searchRequest.source(sourceBuilder);
//5. 查询数据
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
//通过getHits来获取查询结果数据
for (SearchHit searchHit : searchResponse.getHits().getHits()) {
    System.out.println(searchHit.getSourceAsMap());
}

在这里插入图片描述

注:==sourceBuilder.from(0).size(2);==来实现分页查询。

3.3.3 高亮查询
SearchRequest searchRequest = new SearchRequest("test01");
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
//1. 设置高亮构造器
HighlightBuilder highlightBuilder = new HighlightBuilder();
//2. 标注哪些字段高亮
highlightBuilder.field("name");
//3. 设置高亮开始标签
highlightBuilder.preTags("<span style='color:red;'>");
//4. 设置高亮结束标签
highlightBuilder.postTags("</span>");
sourceBuilder.highlighter(highlightBuilder);

MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "李");
sourceBuilder.query(matchQueryBuilder);

searchRequest.source(sourceBuilder);
SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
for(SearchHit  searchHit: searchResponse.getHits()) {
    Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
    HighlightField highlightField = highlightFields.get("name");
    System.out.println(highlightField.getFragments()[0].toString());
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值