ToB企服应用市场:ToB评测及商务社交产业平台

标题: Spring boot 整合elasticsearch [打印本页]

作者: 农妇山泉一亩田    时间: 2025-2-14 21:51
标题: Spring boot 整合elasticsearch
ES配置

config配置类

  1. @Configuration
  2. @ConfigurationProperties(prefix = "es")
  3. @Data
  4. public class InitEsRes {
  5.     private String host;
  6.     private int port;
  7.     private String scheme;
  8.     @Bean
  9.     public RestHighLevelClient restHighLevelClient(){
  10.         return new RestHighLevelClient(
  11.                 RestClient.builder(new HttpHost(host,port,scheme))
  12.         );
  13.     }
  14. }
复制代码
application.yml 配置

  1. es:
  2.   host: localhost
  3.   port: 9200
  4.   scheme: http
复制代码
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增长了如下几点新功能,帮助你用它写博客:
ES 增删改查 代码实例

业务层 serviceImpl

高亮

  1. @Override
  2.     public Result<PageResult<ArticleResponse>> search(ArticleRequest articleRequest) {
  3.         // 定义结果集
  4.         long total = 0;
  5.         List<ArticleResponse> articleResponseList = new ArrayList<>();
  6.         try {
  7.             // 创建 搜索请求对象
  8.             SearchRequest searchRequest = new SearchRequest(INDEX_NAME);
  9.             // 构建 SearchSourceBuilder 查询条件构建器 所有的查询条件都需要给它
  10.             SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
  11.             // 设置查询条件
  12.             // 构建多条件拼接对象
  13.             BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
  14.             // 拼接条件 文章标题 分词
  15.             if (StringUtils.isNotBlank(articleRequest.getTitle())) {
  16.                 boolQueryBuilder.must(QueryBuilders.matchQuery("title", articleRequest.getTitle()));
  17.             }
  18.             // 发布人
  19.             if (articleRequest.getCreateBy() != null) {
  20.                 boolQueryBuilder.must(QueryBuilders.matchQuery("createBy", articleRequest.getCreateBy()));
  21.             }
  22.             // 创建时间 区间
  23.             if (articleRequest.getBeginTime() != null) {
  24.                 boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").gte(articleRequest.getBeginTime().getTime()));
  25.             }
  26.             if (articleRequest.getEndTime() != null) {
  27.                 boolQueryBuilder.must(QueryBuilders.rangeQuery("createTime").lte(articleRequest.getEndTime().getTime()));
  28.             }
  29.             // 将拼接好的 条件 给 条件构建器 SearchSourceBuilder  ******
  30.             searchSourceBuilder.query(boolQueryBuilder);
  31.             // 分页
  32.             // 跳过几条数据 需要公式计算
  33.             searchSourceBuilder.from((articleRequest.getPageNum() - 1) * articleRequest.getPageSize());
  34.             searchSourceBuilder.size(articleRequest.getPageSize());
  35.             // 排序
  36.             searchSourceBuilder.sort("createTime", SortOrder.DESC);
  37.             // 高亮
  38.             searchSourceBuilder.highlighter(new HighlightBuilder().field("title").preTags("<span style="color:red;">").postTags("</span>"));
  39.             // 发sing请求之前一定需要将条件构建器 给 searchRequest  ******
  40.             searchRequest.source(searchSourceBuilder);
  41.             // 发送请求
  42.             SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);
  43.             // 获取 响应的数据 【命中】
  44.             SearchHits hits = searchResponse.getHits();
  45.             // 获取总记录数
  46.             total = hits.getTotalHits().value;
  47.             // 获取结果集
  48.             SearchHit[] searchHits = hits.getHits();
  49.             // 遍历获取每一条结果
  50.             for (SearchHit searchHit : searchHits) {
  51.                 // 以JSON的形式获取结果
  52.                 String sourceAsString = searchHit.getSourceAsString();
  53.                 // 反序列化
  54.                 ArticleResponse articleResponse = JSONObject.parseObject(sourceAsString, ArticleResponse.class);
  55.                 // 获取高亮字段
  56.                 Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
  57.                 if (highlightFields != null) {
  58.                     HighlightField highlightField = highlightFields.get("title");
  59.                     // 获取高亮内容
  60.                     if (highlightField != null) {
  61.                         // 获取高亮碎片
  62.                         Text[] fragments = highlightField.getFragments();
  63.                         String str = "";
  64.                         for (Text fragment : fragments) {
  65.                             str += fragment;
  66.                         }
  67.                         // 替换
  68.                         articleResponse.setTitle(str);
  69.                     }
  70.                 }
  71.                 // 添加到结果集
  72.                 articleResponseList.add(articleResponse);
  73.             }
  74.         } catch (Exception e) {
  75.             log.error("搜索文章数据异常,请求参数:{},异常信息是:{}", JSONObject.toJSONString(articleRequest), e);
  76.         }
  77.         // 返回结果
  78.         return PageResult.toResult(total, articleResponseList);
  79.     }
复制代码
添加

  1.    @Override
  2.     public void add(ArticleResponse articleResponse) {
  3.         try {
  4.             // 创建IndexRequest
  5.             IndexRequest indexRequest = new IndexRequest(INDEX_NAME);
  6.             // 设置文档id  以数据库的主键作为文档id
  7.             indexRequest.id(articleResponse.getId() + "");
  8. //            articleResponse.setId(null);
  9.             SimplePropertyPreFilter simplePropertyPreFilter = new SimplePropertyPreFilter();
  10.             simplePropertyPreFilter.getExcludes().add("id");
  11.             // 设置添加的数据
  12.             indexRequest.source(JSONObject.toJSONString(articleResponse, simplePropertyPreFilter), XContentType.JSON);
  13.             // 执行添加请求
  14.             restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);
  15.         } catch (IOException e) {
  16.             log.error("添加数据到ES异常,请求参数:{},异常信息是:{}", JSONObject.toJSONString(articleResponse), e);
  17.         }
  18.     }
复制代码
修改

  1.   @Override
  2.     public void update(ArticleResponse articleResponse) {
  3.         try {
  4.             // 创建 UpdateRequest
  5.             UpdateRequest updateRequest = new UpdateRequest(INDEX_NAME, articleResponse.getId() + "");
  6.             // 设置修改的数据  局部修改
  7.             updateRequest.doc(JSONObject.toJSONString(articleResponse), XContentType.JSON);
  8.             // 执行修改
  9.             restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);
  10.         } catch (IOException e) {
  11.             log.error("修改ES异常,请求参数:{},异常信息是:{}", JSONObject.toJSONString(articleResponse), e);
  12.         }
  13.     }
复制代码
删除

  1. @Override
  2.     public void delete(String id) {
  3.         try {
  4.             // 创建DeleteRequest
  5.             DeleteRequest deleteRequest = new DeleteRequest(INDEX_NAME, id);
  6.             // 执行删除请求
  7.             restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);
  8.         } catch (IOException e) {
  9.         }
  10.     }
复制代码
根据ID查询

  1.     @Override
  2.     public ArticleResponse findById(String id) {
  3.         try {
  4.             //
  5.             GetRequest getRequest = new GetRequest(INDEX_NAME, id);
  6.             // 执行请求
  7.             GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
  8.             // 判断是否查询到
  9.             if (getResponse.isExists()) {
  10.                 // 获取数据 JSON字符串
  11.                 String sourceAsString = getResponse.getSourceAsString();
  12.                 // 反序列化成 对象
  13.                 return JSONObject.parseObject(sourceAsString, ArticleResponse.class);
  14.             }
  15.         } catch (IOException e) {
  16.         }
  17.         return null;
  18.     }
复制代码
批量添加

  1.     @Override
  2.     public void batchAdd(List<ArticleResponse> articleResponses) {
  3.         try {
  4.             BulkRequest bulkRequest = new BulkRequest();
  5.             // 遍历
  6.             articleResponses.forEach(articleResponse -> {
  7.                 bulkRequest.add(new IndexRequest(INDEX_NAME)
  8.                         .id(articleResponse.getId() + "")
  9.                         .source(JSONObject.toJSONString(articleResponse), XContentType.JSON));
  10.             });
  11.             // 发送请求
  12.             restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
  13.         } catch (IOException e) {
  14.         }
  15.     }
复制代码
增量同步 两种方案

1.代码实现

  1. /**
  2. * 删除
  3. */
  4. @Override
  5. public void delEs() {
  6.     try {
  7.         //创建条件删除对象
  8.         DeleteByQueryRequest byQueryRequest = new DeleteByQueryRequest(INDEX_NAME);
  9.         //设置删除条件
  10.         byQueryRequest.setQuery(QueryBuilders.matchAllQuery());
  11.         //发送请求
  12.         restHighLevelClient.deleteByQuery(byQueryRequest, RequestOptions.DEFAULT);
  13.     } catch (IOException e) {
  14.         throw new RuntimeException(e);
  15.     }
  16. }
  17. /**
  18. 1. 添加
  19. 2. @param goods
  20. */
  21. @Override
  22. public void beach(List<Goods> goods) {
  23.     try {
  24.         BulkRequest request = new BulkRequest();
  25.         goods.forEach(goods1 -> {
  26.             request.add(new IndexRequest(INDEX_NAME).
  27.                     id(goods1.getGoodsId()+"").
  28.                     source(JSONObject.toJSONString(goods1), XContentType.JSON));
  29.         });
  30.         restHighLevelClient.bulk(request,RequestOptions.DEFAULT);
  31.     } catch (IOException e) {
  32.         throw new RuntimeException(e);
  33.     }
  34. }
复制代码
  1. 定时器 一分钟执行一次
  2. @Autowired
  3. private EsFeignService esFeignService;
  4. @Autowired
  5. private EsService esService;
  6. @Scheduled(cron = "0 0/1 * * * ?")
  7. public void SyncBlog2EsPerMinute(){
  8.     //查出所有商品数据
  9.     List<Goods> list = esFeignService.list();
  10.     if(!list.isEmpty()){
  11.         //删除es数据
  12.         esService.delEs();
  13.         //添加最新数据
  14.         esService.beach(list);
  15.     }
  16. }
复制代码
2.logstash实现 (版本要和你的es版本同等,我这里用得是7.17.0)


在bin目录下有一个 conf文件


这里定时使命多长时间执行一次
这个是映射

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


可以直接在这里输入cmd直接进入这个目录

输入这个下令等候执行就ok了 logstash.bat -f logstash.conf

这是乐成的示例

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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4