ToB企服应用市场:ToB评测及商务社交产业平台
标题:
Spring boot 整合elasticsearch
[打印本页]
作者:
农妇山泉一亩田
时间:
2025-2-14 21:51
标题:
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)
在bin目录下有一个 conf文件
这里定时使命多长时间执行一次
这个是映射
修改完成后在当前目录下进入终端
可以直接在这里输入cmd直接进入这个目录
输入这个下令等候执行就ok了 logstash.bat -f logstash.conf
这是乐成的示例
mermaid语法阐明 ↩︎
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4