农妇山泉一亩田 发表于 2025-2-14 21:51:10

Spring boot 整合elasticsearch

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编辑器功能,我们增长了如下几点新功能,帮助你用它写博客:

[*]全新的界面计划 ,将会带来全新的写作体验;
[*]在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
[*]增长了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
[*]全新的 KaTeX数学公式 语法;
[*]增长了支持甘特图的mermaid语法1 功能;
[*]增长了 多屏幕编辑 Markdown文章功能;
[*]增长了 核心写作模式、预览模式、简便写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
[*]增长了 检查列表 功能。
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.代码实现


[*]做批量添加和删除

/**
* 删除
*/
@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);
    }
}

[*]定时执行使命(可以根据本身的需求进行定时)

定时器 一分钟执行一次
@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)

https://i-blog.csdnimg.cn/direct/1d11e0012d8c456bb9e0f757f3da2d5b.png
在bin目录下有一个 conf文件
https://i-blog.csdnimg.cn/direct/6f7c91c2f53447c0979c4d3a80624a0d.png
https://i-blog.csdnimg.cn/direct/41544721dda44a8c96f0e108cdf8fb51.png
https://i-blog.csdnimg.cn/direct/84dfd1b2862846458e41bcd7122b0409.png这里定时使命多长时间执行一次
https://i-blog.csdnimg.cn/direct/65bd032659bf45529ebba961e5611e49.png这个是映射
https://i-blog.csdnimg.cn/direct/3af7a489c45d4cb980653c114b0e5d21.png
修改完成后在当前目录下进入终端

https://i-blog.csdnimg.cn/direct/bf8e22382d024d4fbaf518c899062b1c.png
可以直接在这里输入cmd直接进入这个目录
https://i-blog.csdnimg.cn/direct/13146ed860d043f3bcf8b7fc75973fb0.png
输入这个下令等候执行就ok了 logstash.bat -f logstash.conf
https://i-blog.csdnimg.cn/direct/84c71a161a00404aa616fad532a6dab9.png
这是乐成的示例
   
[*]mermaid语法阐明 ↩︎

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Spring boot 整合elasticsearch