首页 > 其他分享 >Spring boot 整合elasticsearch

Spring boot 整合elasticsearch

时间:2024-10-26 08:50:39浏览次数:3  
标签:articleResponse Spring boot id articleRequest elasticsearch new restHighLevelCli

文章目录

ES配置

config配置类

@Configuration
@ConfigurationProperties(prefix = "es")
@Data
public class InitEsRes {
    private String host;
    private int port;
    private String scheme;

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        return new RestHighLevelClient(
                RestClient.builder(new HttpHost(host,port,scheme))
        );
    }
}

application.yml 配置

es:
  host: localhost
  port: 9200
  scheme: http

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

ES 增删改查 代码实例

业务层 serviceImpl

高亮

 @Override
    public Result<PageResult<ArticleResponse>> search(ArticleRequest articleRequest) {
        // 定义结果集
        long total = 0;
        List<ArticleResponse> articleResponseList = new ArrayList<>();
        try {
            // 创建 搜索请求对象
            SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
            // 构建 SearchSourceBuilder 查询条件构建器 所有的查询条件都需要给它
            SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
            // 设置查询条件
            // 构建多条件拼接对象
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
            // 拼接条件 文章标题 分词
            if (StringUtils.isNotBlank(articleRequest.getTitle())) {
                boolQueryBuilder.must(QueryBuilders.matchQuery("title", articleRequest.getTitle()));
            }
            // 发布人
            if (articleRequest.getCreateBy() != null) {
                boolQueryBuilder.must(QueryBuilders.matchQuery("createBy", articleRequest.getCreateBy()));
            }
            // 创建时间 区间
            if (articleRequest.getBeginTime() != null) {
                boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").gte(articleRequest.getBeginTime().getTime()));
            }
            if (articleRequest.getEndTime() != null) {
                boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").lte(articleRequest.getEndTime().getTime()));
            }
            // 将拼接好的 条件 给 条件构建器 SearchSourceBuilder  ******
            searchSourceBuilder.query(boolQueryBuilder);
            // 分页
            // 跳过几条数据 需要公式计算
            searchSourceBuilder.from((articleRequest.getPageNum() - 1) * articleRequest.getPageSize());
            searchSourceBuilder.size(articleRequest.getPageSize());
            // 排序
            searchSourceBuilder.sort("createTime", SortOrder.DESC);
            // 高亮
            searchSourceBuilder.highlighter(new HighlightBuilder().field("title").preTags("<span style=\"color:red;\">").postTags("</span>"));
            // 发sing请求之前一定需要将条件构建器 给 searchRequest  ******
            searchRequest.source(searchSourceBuilder);
            // 发送请求
            SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
            // 获取 响应的数据 【命中】
            SearchHits hits = searchResponse.getHits();
            // 获取总记录数
            total = hits.getTotalHits().value;
            // 获取结果集
            SearchHit[] searchHits = hits.getHits();
            // 遍历获取每一条结果
            for (SearchHit searchHit : searchHits) {
                // 以JSON的形式获取结果
                String sourceAsString = searchHit.getSourceAsString();
                // 反序列化
                ArticleResponse articleResponse = JSONObject.parseObject(sourceAsString, ArticleResponse.class);
                // 获取高亮字段
                Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
                if (highlightFields != null) {
                    HighlightField highlightField = highlightFields.get("title");
                    // 获取高亮内容
                    if (highlightField != null) {
                        // 获取高亮碎片
                        Text[] fragments = highlightField.getFragments();
                        String str = "";
                        for (Text fragment : fragments) {
                            str += fragment;
                        }
                        // 替换
                        articleResponse.setTitle(str);
                    }
                }
                // 添加到结果集
                articleResponseList.add(articleResponse);
            }
        } catch (Exception e) {
            log.error("搜索文章数据异常,请求参数:{},异常信息是:{}", JSONObject.toJSONString(articleRequest), e);
        }
        // 返回结果
        return PageResult.toResult(total, articleResponseList);
    }

添加

   @Override
    public void add(ArticleResponse articleResponse) {
        try {
            // 创建IndexRequest
            IndexRequest indexRequest = new IndexRequest(INDEX_NAME);
            // 设置文档id  以数据库的主键作为文档id
            indexRequest.id(articleResponse.getId() + "");
//            articleResponse.setId(null);
            SimplePropertyPreFilter simplePropertyPreFilter = new SimplePropertyPreFilter();
            simplePropertyPreFilter.getExcludes().add("id");
            // 设置添加的数据
            indexRequest.source(JSONObject.toJSONString(articleResponse, simplePropertyPreFilter), XContentType.JSON);
            // 执行添加请求
            restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.error("添加数据到ES异常,请求参数:{},异常信息是:{}", JSONObject.toJSONString(articleResponse), e);
        }
    }

修改

  @Override
    public void update(ArticleResponse articleResponse) {
        try {
            // 创建 UpdateRequest
            UpdateRequest updateRequest = new UpdateRequest(INDEX_NAME, articleResponse.getId() + "");
            // 设置修改的数据  局部修改
            updateRequest.doc(JSONObject.toJSONString(articleResponse), XContentType.JSON);
            // 执行修改
            restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {
            log.error("修改ES异常,请求参数:{},异常信息是:{}", JSONObject.toJSONString(articleResponse), e);
        }
    }

删除

@Override
    public void delete(String id) {
        try {
            // 创建DeleteRequest
            DeleteRequest deleteRequest = new DeleteRequest(INDEX_NAME, id);
            // 执行删除请求
            restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {

        }
    }

根据ID查询


    @Override
    public ArticleResponse findById(String id) {
        try {
            //
            GetRequest getRequest = new GetRequest(INDEX_NAME, id);
            // 执行请求
            GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
            // 判断是否查询到
            if (getResponse.isExists()) {
                // 获取数据 JSON字符串
                String sourceAsString = getResponse.getSourceAsString();
                // 反序列化成 对象
                return JSONObject.parseObject(sourceAsString, ArticleResponse.class);
            }
        } catch (IOException e) {

        }
        return null;
    }

批量添加

    @Override
    public void batchAdd(List<ArticleResponse> articleResponses) {
        try {
            BulkRequest bulkRequest = new BulkRequest();
            // 遍历
            articleResponses.forEach(articleResponse -> {
                bulkRequest.add(new IndexRequest(INDEX_NAME)
                        .id(articleResponse.getId() + "")
                        .source(JSONObject.toJSONString(articleResponse), XContentType.JSON));
            });
            // 发送请求
            restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
        } catch (IOException e) {

        }
    }

增量同步 两种方案

1.代码实现

  1. 做批量添加和删除

/**
 * 删除
 */
@Override
public void delEs() {
    try {
        //创建条件删除对象
        DeleteByQueryRequest byQueryRequest = new DeleteByQueryRequest(INDEX_NAME);
        //设置删除条件
        byQueryRequest.setQuery(QueryBuilders.matchAllQuery());
        //发送请求
        restHighLevelClient.deleteByQuery(byQueryRequest, RequestOptions.DEFAULT);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

/**
 1. 添加
 2. @param goods
 */
@Override
public void beach(List<Goods> goods) {
    try {
        BulkRequest request = new BulkRequest();

        goods.forEach(goods1 -> {
            request.add(new IndexRequest(INDEX_NAME).
                    id(goods1.getGoodsId()+"").
                    source(JSONObject.toJSONString(goods1), XContentType.JSON));
        });
        restHighLevelClient.bulk(request,RequestOptions.DEFAULT);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}
  1. 定时执行任务(可以根据自己的需求进行定时)

定时器 一分钟执行一次
@Autowired
private EsFeignService esFeignService;

@Autowired
private EsService esService;

@Scheduled(cron = "0 0/1 * * * ?")
public void SyncBlog2EsPerMinute(){

    //查出所有商品数据
    List<Goods> list = esFeignService.list();

    if(!list.isEmpty()){
        //删除es数据
        esService.delEs();

        //添加最新数据
        esService.beach(list);
    }
}

2.logstash实现 (版本要和你的es版本一致,我这里用得是7.17.0)

在这里插入图片描述
在bin目录下有一个 conf文件
这里连接你自己的mysql
查询语句
在这里插入图片描述这里定时任务多长时间执行一次
在这里插入图片描述这个是映射
在这里插入图片描述

修改完成后在当前目录下进入终端

在这里插入图片描述
可以直接在这里输入cmd直接进入这个目录
在这里插入图片描述
输入这个命令等待执行就ok了 logstash.bat -f logstash.conf

在这里插入图片描述
这是成功的示例


  1. mermaid语法说明 ↩︎

标签:articleResponse,Spring,boot,id,articleRequest,elasticsearch,new,restHighLevelCli
From: https://blog.csdn.net/2401_86799237/article/details/143227221

相关文章

  • 基于Springboot麻将棋牌室预约网站设计与实现计算机毕业设计成品和开题报告
      博主介绍:黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育、辅导。所有项目都配有从入门到精通的基础知识视频课程,学习后应对毕业设计答辩,提供核心代码讲解,答辩指导。项目配有对应开......
  • 你了解的spring框架有哪些
    列举一些重要的Spring模块?SpringCore: 基础,可以说Spring其他所有的功能都需要依赖于该类库。主要提供IOC依赖注入功能。**SpringAspects**:该模块为与AspectJ的集成提供支持。SpringAOP :提供了面向方面的编程实现。SpringJDBC :Java数据库连接。SpringJMS :Jav......
  • [java毕业设计]免费分享一套SpringBoot+Vue宠物商城网站系统【论文+源码+SQL脚本】,帅
    大家好,我是java1234_小锋老师,看到一个不错的SpringBoot++Vue宠物商城网站系统,分享下哈。项目视频演示【免费】SpringBoot+Vue宠物商城网站系统Java毕业设计_哔哩哔哩_bilibili项目介绍本论文旨在设计与实现一个基于SpringBoot和Vue.js的宠物商城网站系统。随着互联网技......
  • 基于SpringBoot+Vue的药店管理系统设计与实现毕设(文档+源码)
            目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的药店管理系统,项目源码请点击文章末尾联系我哦~目前有各类成品毕......
  • 基于SpringBoot+Vue的校园二手书交易平台管理系统设计与实现毕设(文档+源码)
           目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的校园二手书交易平台管理系统,项目源码请点击文章末尾联系我哦~目前有......
  • 基于SpringBoot + Vue + MySQL 实现平行志愿录取系统(数据库设计&毕业设计)
    一、需求分析        平行志愿录取系统是一种用于高等院校招生录取的志愿填报和录取方式,旨在提高录取的公平性和科学性,确保考生能够在选择志愿时有更大的灵活性和机会。下面详细分析平行志愿录取系统的定义、功能以及其优缺点。志愿录取系统功能:志愿填报:考生可以......
  • 基于Spring Boot+Android的民宿预订系统
    目录前言 一、技术栈二、系统功能介绍三、核心代码1、登录模块 2、文件上传模块3、代码封装前言Android的民宿预订系统设计的目的是为用户提供民宿客房、公告信息等方面的平台。与PC端应用程序相比,Android的民宿预订系统的设计主要面向于民宿,旨在为管理员和用户......
  • 基于Spring Boot+Android的武汉市公交路线查询系统
    目录前言 一、技术栈二、系统功能介绍三、核心代码1、登录模块 2、文件上传模块3、代码封装前言武汉市公交路线查询系统APP设计的目的是为用户提供公交路线等方面的平台。与PC端应用程序相比,武汉市公交路线查询管理的设计主要面向于公交公司,旨在为管理员和用户......
  • 基于SpringBoot的学生社团管理系统【附源码】
    ​基于SpringBoot的学生社团管理系统(源码+L文+说明文档)     目录4系统设计  4.1界面设计原则  4.2功能模块设计  4.3数据库设计  4.3.1数据库E-R图  4.3.2数据库表结构  5 系统实现   5.1 管理员功能实现  5.1.1 团长管理  5.1.2......
  • Springboot+vue图书商城购物系统【附源码】
    Springboot+vue图书商城购物系统(源码+L文+说明文档)  目录 四系统设计  4.1系统概述 4.2系统层次架构  4.3系统功能详情设计  4.4主流程描述  五、系统实现  5.1用户登录:  5.2用户注册  5.3前端首页   5.4管理员首页  5.5书籍分类管理......