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

  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语法说明 ↩︎

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值