SpringBoot整合Elasticsearch

SpringBoot整合Elasticsearch

SpringBoot整合Elasticsearch有以下几种方式:

  1. 使用官方的Elasticsearch Java客户端进行集成
    • 通过添加Elasticsearch Java客户端的依赖,可以直接在Spring Boot应用中使用原生的Elasticsearch API进行操作。
    • 参考文档
  2. 使用Spring Data Elasticsearch进行集成
    • Spring Data Elasticsearch是Spring Data项目的一部分,提供了更高级的抽象和易用性,可以简化与Elasticsearch的交互。
    • 通过添加Spring Data Elasticsearch的依赖,可以使用Repository接口和注解来定义和执行CRUD操作。
    • 官方文档

本文使用第一种方式。使用官方推荐的RestHighLevelClient操作ES。由于版本兼容问题,请选择和Elasticsearch对应的Java客户端版本。

依赖

在这里插入图片描述
从官方文档可以知道需要导入org.elasticsearch:elasticsearch和org.elasticsearch.client:elasticsearch-rest-client。


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>7.4.2</version>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

配置

@Configuration
public class ESConfig {

    /**
     * 解决netty引起的issue
     */
    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }


    @Bean
    public RestHighLevelClient getRestClient() {

        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(RestClient
                .builder(new HttpHost("192.168.200.200", 9200, "http")));
        return restHighLevelClient;
    }

}

测试

创建索引

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    /**
     * 创建索引
     */
    @Test
    public void createIndex1() {
        String result = "创建成功";
        CreateIndexRequest createIndexRequest = new CreateIndexRequest("stu");
        try {
            CreateIndexResponse createIndexResponse = restHighLevelClient.indices().create(createIndexRequest, RequestOptions.DEFAULT);

            if (!createIndexResponse.isAcknowledged()){
                result = "创建失败";
            }else{
                result = "索引已经存在";
            }
        } catch (IOException e) {
            e.printStackTrace();
            result = "接口异常";
        }

        System.out.println(result);
    }
   /**
     * 创建索引同时创建映射关系
     * 如索引存在:新增文档数据;如果索引不存在:创建一条索引
     */
    @Test
    public void createIndex2() {
        HashMap<String, Object> map = new HashMap<>();
        map.put("user", "kimchyrw");
        map.put("postDate", new Date());
        map.put("message", "trying out Elasticsearch");

        IndexRequest request = new IndexRequest("posts")
                .id("2").source(map, XContentType.JSON);

        try {
            //响应信息
            IndexResponse indexResponse = restHighLevelClient.index(request, RequestOptions.DEFAULT);
            String index = indexResponse.getIndex();
            String id = indexResponse.getId();
            System.out.println("index: " + index + " id: " + id);
            //创建索引还是更新索引
            if (indexResponse.getResult() == DocWriteResponse.Result.CREATED) {
                System.out.println("CREATED.....");
            } else if (indexResponse.getResult() == DocWriteResponse.Result.UPDATED) {
                System.out.println("UPDATED....");
            }
            //校验分片信息
            ReplicationResponse.ShardInfo shardInfo = indexResponse.getShardInfo();
            if (shardInfo.getTotal() != shardInfo.getSuccessful()){

            }
            if (shardInfo.getFailed() > 0) {
                for (ReplicationResponse.ShardInfo.Failure failure :shardInfo.getFailures()) {
                    String reason = failure.reason();
                    System.out.println("reason: " + reason);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

更新文档中的数据

    /**
     * 更新一行数据
     */
    @Test
    public void updateDoc() {
        //更新的数据
        HashMap<String, Object> map = new HashMap<>();
        map.put("updated", new Date());
        map.put("user", "kimchyrw");
        map.put("reason", "daily update");
        UpdateRequest updateRequest = new UpdateRequest("posts", "2")
                .doc(map);
        try {
            UpdateResponse updateResponse = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
            String index = updateResponse.getIndex();
            String id = updateResponse.getId();
            long version = updateResponse.getVersion();
            if (updateResponse.getResult() == DocWriteResponse.Result.CREATED) {
                System.out.println("CREATED");
            } else if (updateResponse.getResult() == DocWriteResponse.Result.UPDATED) {
                System.out.println("UPDATED");
            } else if (updateResponse.getResult() == DocWriteResponse.Result.DELETED) {
                System.out.println("DELETED");
            } else if (updateResponse.getResult() == DocWriteResponse.Result.NOOP) {
                System.out.println("NOOP");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

查询

   /**
     * 根据id查询document
     */
    @Test
    public void getApi() {
        GetRequest getRequest = new GetRequest("posts", "1");
        //可选参数
        //禁用源检索,默认启用,开启后检索不到数据
       // getRequest.fetchSourceContext(FetchSourceContext.DO_NOT_FETCH_SOURCE);

        try {
            GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
            String index = getResponse.getIndex();
            String id = getResponse.getId();
            System.out.println("index: " + index + " id: " + id);
            if (getResponse.isExists()) {
                long version = getResponse.getVersion();
                String sourceAsString = getResponse.getSourceAsString();
                Map<String, Object> sourceAsMap = getResponse.getSourceAsMap();
                byte[] sourceAsBytes = getResponse.getSourceAsBytes();
                System.out.println("version: " + version);
                System.out.println("sourceAsMap: " + sourceAsMap);
                System.out.println("sourceAsBytes: " + Arrays.toString(sourceAsBytes));
                System.out.println("sourceAsString: " + sourceAsString);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
   /**
     * 根据指定字段查询document
     */
    @Test
    public void testSearch2() {
        SearchRequest searchRequest = new SearchRequest("posts");
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //根据指定字段查询
        searchSourceBuilder.query(QueryBuilders.termQuery("user", "kimchy"));
        //分页查询记录
        searchSourceBuilder.from(0);
        searchSourceBuilder.size(5);
        //设置超时时间
       // searchSourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
        //按字段排序或者按评分排序
        searchSourceBuilder.sort(new ScoreSortBuilder().order(SortOrder.DESC));
        searchSourceBuilder.sort(new FieldSortBuilder("_id").order(SortOrder.ASC));

        //结果高亮

        //查询部分字段
        searchSourceBuilder.fetchSource(new String[]{"user"}, new String[]{"user1"});
        searchRequest.source(searchSourceBuilder);

        try {
            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            RestStatus status = searchResponse.status();
            TimeValue took = searchResponse.getTook();
            Boolean terminatedEarly = searchResponse.isTerminatedEarly();
            boolean timedOut = searchResponse.isTimedOut();

            SearchHits hits = searchResponse.getHits();
            TotalHits totalHits = hits.getTotalHits();
            long numHits = totalHits.value;
            TotalHits.Relation relation = totalHits.relation;
            float maxScore = hits.getMaxScore();
            System.out.println("hits: " + hits + " totalHits: " + totalHits + " numHits: " + numHits + " maxScore: " + maxScore);
            SearchHit[] searchHits = hits.getHits();
            for (SearchHit hit: searchHits) {
                String id = hit.getId();
                System.out.println("id: " + id);
                String sourceAsString = hit.getSourceAsString();
                System.out.println(sourceAsString);
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

参考

  • Rest High Level Client文档
  • Spring Data Elasticsearch - Reference Documentation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/47549.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么要学框架?什么是Spring?

为什么要学框架&#xff1f;什么是Spring&#xff1f; 一、为什么要学框架&#xff1f; 学习框架相当于从 “小作坊” 到 “工厂” 的升级&#xff0c;小作坊什么都要自己做&#xff0c;工厂是组件式装配&#xff0c;特点就是高效。框架更加易用、简单且高效。 框架的优点展…

7.26 作业 QT

1.继续完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中&#xff1a; 结果图&#xff1a; second.h: #define SECOND_H#include <QWidget> #include<QDebug> //信息调试类&#xff0c;用于打印输出的 #inc…

【C语言初阶】指针篇—上

目录 1. 指针是什么&#xff1f;2. 指针和指针类型2.1 指针-整数2.2 指针的解引用 3. 野指针3.1 野指针成因1. 指针未初始化2. 指针越界访问3. 指针指向的空间释放 3.2 如何规避野指针 1. 指针是什么&#xff1f; 指针是什么&#xff1f; 指针理解的2个要点&#xff1a; > 1…

【Nodejs】Express模板使用

1.Express脚手架的安装 安装Express脚手架有两种方式&#xff1a; 使用express-generator安装 使用命令行进入项目目录&#xff0c;依次执行&#xff1a; cnpm i -g express-generator可通过express -h查看命令行的指令含义 express -hUsage: express [options] [dir] Optio…

spring eurake中使用IP注册

在开发spring cloud的时候遇到一个很奇葩的问题&#xff0c;就是服务向spring eureka中注册实例的时候使用的是机器名&#xff0c;然后出现localhost、xxx.xx等这样的内容&#xff0c;如下图&#xff1a; eureka.instance.perferIpAddresstrue 我不知道这朋友用的什么spring c…

【Redis】高级篇: 一篇文章讲清楚Redis的单线程和多线程

目录 面试题 Redis到底是多线程还是单线程&#xff1f; 简单回答 详解 Redis的“单线程” Redis为什么选择单线程&#xff1f; 后来Redis为什么又逐渐加入了多线程特性&#xff1f; Redis为什么快&#xff1f; 回答 IO多路复用 Unix网络编程的5种IO模型 主线程和IO…

常见面试题之常见技术场景

1. 单点登录这块怎么实现的&#xff1f; 1.1 概述 单点登录的英文名叫做&#xff1a;Single Sign On&#xff08;简称 SSO &#xff09;&#xff0c;只需要登录一次&#xff0c;就可以访问所有信任的应用系统。 在以前的时候&#xff0c;一般我们就单系统&#xff0c;所有的…

DSA之查找(1):线性表的查找

文章目录 0 知识回顾1 查找1.1 查找的概念 2 线性表的查找2.1 顺序查找2.1.1 顺序查找算法2.1.2 顺序查找的性能分析2.1.3 顺序查找的特点 2.2 折半查找&#xff08;二分&#xff09;2.2.1 折半查找算法2.2.2 折半查找的性能分析2.2.3 折半查找的特点 2.3 分块查找2.3.1 分块查…

0基础系列C++教程 从0开始 第二课

0基础系列C教程 从0开始 第二课来了&#xff01; 复习第一课内容 1 怎么输出数字“1919810”&#xff1f; 答案&#xff08;关键语句&#xff09;: cout<<"1919810"; 2 怎么输出字符串“Hello World”&#xff1f; 答案&#xff08;关键语句&#xff09;&a…

梯度提升树的基本思想

目录 1. 梯度提升树 VS AdaBoost 2. GradientBoosting回归与分类的实现 2.1 GradientBoosting回归 2.2 GradientBoosting分类 1. 梯度提升树 VS AdaBoost 梯度提升树&#xff08;Gradient Boosting Decision Tree&#xff0c;GBDT&#xff09;是提升法中的代表性算法&#…

朝花夕拾思维导图怎么画?看看这种绘制方法

朝花夕拾思维导图怎么画&#xff1f;绘制思维导图的好处有很多&#xff0c;首先它可以帮助人们更好地组织和管理知识&#xff0c;提高工作效率和学习效果。其次&#xff0c;绘制思维导图可以帮助人们更好地记忆知识点和理解知识点。总之&#xff0c;绘制思维导图可以帮助人们更…

cookie

目录 一、会话技术 二、Cookie 1.创建Cookie 2.使用response响应Cookie给客户端&#xff08;浏览器&#xff09; 3. 获取Cookie 三、Cookie的原理解析 1. 基本实现原理 &#xff08;1&#xff09;响应头&#xff1a;set—cookie &#xff08;2&#xff09;请求头&…

基于 Graviton2处理器构建容器化基因分析工作负载

概述 相对于基于传统 x86架构的处理器来说&#xff0c;Amazon 设计的基于 ARM 架构的 Graviton 处理器为 EC2中运行的云工作负载提供了更佳的性价比。基于 Graviton2 的实例支持广泛的通用型、突发型、计算优化型、内存优化型、存储优化型和加速计算型工作负载&#xff0c;包括…

数字IC实践项目(7)—CNN加速器的设计和实现(付费项目)

数字IC实践项目&#xff08;7&#xff09;—基于Verilog的CNN加速器&#xff08;付费项目&#xff09; 写在前面的话项目整体框图神经网络框图完整电路框图 项目简介和学习目的软件环境要求 资源占用&板载功耗总结 写在前面的话 项目介绍&#xff1a; 卷积神经网络硬件加速…

【C++ 重要知识点总结】自定义类型-类和结构体

类 类的基本特性 数据抽象和封装继承多态 1 类的构成——抽象 概念 数据抽象是一种依赖于接口和实现的分离的编程技术。类的接口包括用户所能执行的操作&#xff1b;类的实现包括类的数据成员、负责接口实现的函数体以及定义类所需要的的各种私有函数。封装实现了类的接口和实…

数据服务:保障数据安全、提升数据价值的利器

04-08把元数据以及在它基础上的五大应用场景&#xff1a;数据发现&#xff08;数据地图&#xff09;、指标管理、模型设计、数据质量、成本优化&#xff0c;全部讲完。这部分内容对应的就是数据中台OneData 方法论。学完这部分内容&#xff0c;你已了解OneData方法论在企业内部…

【业务功能篇55】Springboot+easyPOI 导入导出

Apache POI是Apache软件基金会的开源项目&#xff0c;POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 Apache POI 代码实现复杂&#xff0c;学习成本较高。 Easypoi 功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出…

MySQL基础扎实——MySQL中各种数据类型之间的区别

在MySQL中&#xff0c;有各种不同的数据类型可供选择来存储不同类型的数据。下面是一些常见的数据类型以及它们之间的区别&#xff1a; 整数类型&#xff1a; TINYINT&#xff1a;1字节&#xff0c;范围为-128到127或0到255&#xff08;无符号&#xff09;。SMALLINT&#xff1…

项目文档管理的基本指南

项目文档是一种关键的项目管理资源&#xff0c;它可以提供清晰度&#xff0c;保证参与项目的每个人都在同一页面上&#xff0c;从而确保项目按时、按预算完成。 本文将讨论项目文档的重要性、如何在项目中使用项目文档以及选择好合适的项目文档管理软件的技巧。 什么是项目文…

代码随想录算法学习心得 49 | 647.回文子串、516.最长回文子序列...

一、最长回文子序列 链接&#xff1a;力扣 描述&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 思…