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]