Springboot 整合 Elasticsearch(三):使用RestHighLevelClient操作ES ①

📁 前情提要:

Springboot 整合 Elasticsearch(一):Linux下安装 Elasticsearch 8.x

Springboot 整合 Elasticsearch(二):使用HTTP请求来操作ES

目录

[一、Springboot 整合 Elasticsearch](#一、Springboot 整合 Elasticsearch)

[1、pom.xml 中添加依赖](#1、pom.xml 中添加依赖)

[2、application.yml 中添加配置项](#2、application.yml 中添加配置项)

[3、RestHighLevelClient API介绍](#3、RestHighLevelClient API介绍)

3.1、连接配置类

3.2、检查索引是否存在

3.2、创建索引

3.3、删除索引

3.4、增加文档

3.5、按主键更新文档内容

3.6、按主键删除文档内容

3.7、批量添加文档


一、Springboot 整合 Elasticsearch

1、pom.xml 中添加依赖

java 复制代码
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
        </dependency>

2、application.yml 中添加配置项

java 复制代码
spring:
  elasticsearch:
    rest:
      uris: 192.168.1.250:9200

3、RestHighLevelClient API介绍

3.1、连接配置类

java 复制代码
@Component
public class EsConfig {

    @Value("${spring.elasticsearch.rest.uris}")
    private String uris;

    /**
     * 高版本客户端
     *
     * @return
     */
    @Bean
    public RestHighLevelClient restHighLevelClient() {
        String[] split = uris.split(",");
        HttpHost[] httpHostArray = new HttpHost[split.length];
        for (int i = 0; i < split.length; i++) {
            String item = split[i];
            httpHostArray[i] = new HttpHost(item.split(":")[0], Integer.parseInt(item.split(":")[1]), "http");
        }
        // 创建RestHighLevelClient客户端
        return new RestHighLevelClient(RestClient.builder(httpHostArray));
    }
}

3.2、检查索引是否存在

java 复制代码
    @Test
    public void checkIndex() {
        try {
            String indexName = "forest";
            boolean exists = esConfig.restHighLevelClient().indices().exists(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
            System.out.println("exists:" + exists);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.2、创建索引

java 复制代码
    @Test
    public void createIndex() {
        try {
            // 创建名为"森林"的索引
            String indexName = "forest";
            if (checkIndex(indexName)) {
                log.info("已存在名为{}的索引", indexName);
                return;
            }
            CreateIndexRequest createIndexRequest = new CreateIndexRequest(indexName);
            CreateIndexResponse createIndexResponse = esConfig.restHighLevelClient().indices().create(createIndexRequest, RequestOptions.DEFAULT);
            System.out.println("已创建索引:" + createIndexResponse.index());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public boolean checkIndex(String indexName) {
        boolean exists = false;
        try {
            exists = esConfig.restHighLevelClient().indices().exists(new GetIndexRequest(indexName), RequestOptions.DEFAULT);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return exists;
    }

3.3、删除索引

java 复制代码
    @Test
    public void deleteIndex() {
        String indexName = "forest";
        DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest(indexName);
        // 发送delete请求
        try {
            AcknowledgedResponse response = esConfig.restHighLevelClient().indices().delete(deleteIndexRequest, RequestOptions.DEFAULT);
            System.out.println("是否已删除:" + response.isAcknowledged());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.4、增加文档

java 复制代码
    @Test
    public void createDoc() {
        try {
            String indexName = "forest";
            ForestDoc forestDoc = new ForestDoc();
            forestDoc.setId(001L).setTitle("枫树").setImages("http://fengshu.jpg").setPrice(300.00).setInventory(600);

            // 创建索引请求对象
            IndexRequest indexRequest = new IndexRequest(indexName);
            indexRequest.id(forestDoc.getId().toString());
            indexRequest.source(JSON.toJSONString(forestDoc), XContentType.JSON);
            // 设置数据刷新策略
            indexRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);

            IndexResponse index = esConfig.restHighLevelClient().index(indexRequest, RequestOptions.DEFAULT);
            System.out.println("状态:" + index.status().getStatus());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

⚠️​​​​​RefreshPolicy 刷新策略, 是WriteRequest接口中的一个内部枚举

① IMMEDIATE:

请求向ElasticSearch提交了数据,立即进行数据刷新,然后再结束请求。

优点:实时性高、操作延时短。

缺点:资源消耗高。

② WAIT_UNTIL:

请求向ElasticSearch提交了数据,等待数据完成刷新,然后再结束请求。

优点:实时性高、操作延时长。

缺点:资源消耗低。

③ NONE:

默认策略。

请求向ElasticSearch提交了数据,不关系数据是否已经完成刷新,直接结束请求。

优点:操作延时短、资源

3.5、按主键更新文档内容

修改 id 为 2 的 images字段内容

java 复制代码
    @Test
    public void updateDocById() {
        try {
            String indexName = "forest";
            String id = "2";
            UpdateRequest updateRequest = new UpdateRequest(indexName, id);
            Map<String, Object> map = new HashMap<>();
            map.put("images", "http://baihuashu.jpg");
            updateRequest.doc(map);
            UpdateResponse update = esConfig.restHighLevelClient().update(updateRequest, RequestOptions.DEFAULT);
            System.out.println("状态:" + update.status().getStatus());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.6、按主键删除文档内容

java 复制代码
    @Test
    public void deleteDocById() {
        String indexName = "forest";
        String id = "5";
        DeleteRequest deleteRequest = new DeleteRequest(indexName,id);
        try {
            DeleteResponse delete = esConfig.restHighLevelClient().delete(deleteRequest, RequestOptions.DEFAULT);
            System.out.println("状态:" + delete.status().getStatus());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

3.7、批量添加文档

java 复制代码
    @Test
    public void batchCreateDoc() {
        try {
            String indexName = "forest";

            List<ForestDoc> list = new ArrayList<>();

            ForestDoc forestDoc = new ForestDoc();
            forestDoc.setId(6L).setTitle("批量_柏树").setImages("http://baishu.jpg").setPrice(1100.00).setInventory(1200);
            list.add(forestDoc);

            ForestDoc forestDoc2 = new ForestDoc();
            forestDoc2.setId(7L).setTitle("批量_苹果树").setImages("http://pingguoshu.jpg").setPrice(1200.00).setInventory(1300);
            list.add(forestDoc2);

            ForestDoc forestDoc3 = new ForestDoc();
            forestDoc3.setId(8L).setTitle("批量_海棠树").setImages("http://haitangshu.jpg").setPrice(1300.00).setInventory(1400);
            list.add(forestDoc3);

            //批量导入
            BulkRequest bulk = new BulkRequest(indexName);

            for (ForestDoc doc : list) {
                IndexRequest indexRequest = new IndexRequest();
                indexRequest.id(doc.getId().toString());
                indexRequest.source(JSON.toJSONString(doc), XContentType.JSON);
                bulk.add(indexRequest);
            }
            BulkResponse bulkResponse = esConfig.restHighLevelClient().bulk(bulk, RequestOptions.DEFAULT);
            System.out.println("状态:" + bulkResponse.status().getStatus());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

相关推荐
我命由我12345几秒前
Android 开发问题:无法从存储库 “D:\keys\MyNotifications.jks“ 中读取密钥 MyNotifications.
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
Elasticsearch2 分钟前
Elastic Security、Observability 和 Search 现在在你的 AI 工具中提供交互式 UI
elasticsearch
dEso RSET9 分钟前
Skywalking介绍,Skywalking 9.4 安装,SpringBoot集成Skywalking
spring boot·后端·skywalking
ROLL.711 分钟前
同步与异步
android·java
青槿吖11 分钟前
告别RestTemplate!Feign让微服务调用像点外卖一样简单
java·开发语言·分布式·spring cloud·微服务·云原生·架构
MacroZheng12 分钟前
横空出世!IDEA最强Spring插件来了,让你的开发效率成倍提升!
java·spring boot·后端
6Hzlia13 分钟前
【Hot 100 刷题计划】 LeetCode 155. 最小栈 | C++ 打包状态法 (最优雅的 O(1) 检索)
java·c++·leetcode
2501_9130613413 分钟前
网络原理之HTTP(2)
java·网络协议
NEGl DRYN14 分钟前
Spring Boot 3.3.4 升级导致 Logback 之前回滚策略配置不兼容问题解决
java·spring boot·logback
zhougl99615 分钟前
Git 命令速查手册
大数据·git·elasticsearch