在gitee、飞书、百度云、B站中,黑马都没有上传该部分资料,以下皆为个人观点,如有纰漏欢迎指正

1.先把item-service中的searchcontroller抽出来,抽到一个模块中并将其设为hmall的子模块

2.引入依赖common,nacos,bootstrap,es

        <!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--common-->
<dependency>
<groupId>com.heima</groupId>
<artifactId>hm-common</artifactId>
<version>1.0.0</version>
</dependency>
<!--nacos 服务注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--nacos配置管理-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--读取bootstrap文件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--es -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>

3.修改配置文件,bootstrap只改服务名,不需要的云配置不要写;application中添加上配置,实现自动装填

spring:
elasticsearch:
uris: http://192.168.88.95:9200

4.这时启动一下服务,看看nacos里有米有注册服务

5.我把文件直接CV过来了,因为这些东西应该不太公共,只是搜索相关会用到,因此没有抽取到common中

这里新增了一个ItemVO,其中字段就是为了对标输出内容中的total,pages,list三个数据,以便于传给前端

6.简单的实现了一下service层中的查询(可能没写全,不过差不多了)

@Service
@Slf4j
@RequiredArgsConstructor
public class ItemServiceImpl implements ItemService {
private final RestHighLevelClient client; /*
* total:"88475"
* pages:"4424"
* list[{},{},{}]
* */
public ItemVO search(ItemPageQuery query) throws IOException {
Integer pageNo = Integer.valueOf(query.getPageNo());
Integer pageSize = Integer.valueOf(query.getPageSize());
SearchRequest request = new SearchRequest("hmall");
BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder();
if (query.getKey() != null && !query.getKey().isEmpty()) {
boolQueryBuilder.must(QueryBuilders.matchQuery("name", query.getKey()));
}else {
boolQueryBuilder.must(QueryBuilders.matchAllQuery());
} if(query.getCategory()!=null){
boolQueryBuilder.filter(QueryBuilders.termQuery("category", query.getCategory()));
}
if(query.getBrand()!=null){
boolQueryBuilder.filter(QueryBuilders.termQuery("brand", query.getBrand()));
} if(query.getSortBy()!=null&&query.getIsAsc().equals("false")){
request.source().sort(query.getSortBy(), SortOrder.DESC);
}else if(query.getSortBy()!=null&&query.getIsAsc().equals("true")){
request.source().sort(query.getSortBy(), SortOrder.ASC);
}
if(query.getMinPrice()!=null&&query.getMaxPrice()!=null){
boolQueryBuilder.filter(QueryBuilders.rangeQuery("price").gte(query.getMinPrice()).lte(query.getMaxPrice()));
} // 分页
request.source().query(boolQueryBuilder).from((pageNo - 1) * pageSize).size(pageSize);
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
SearchHits hit = response.getHits(); SearchHit[] hits = hit.getHits();
List<ItemDoc>list=new ArrayList<>();
for (SearchHit documentFields : hits) {
String sourceAsString = documentFields.getSourceAsString();
ItemDoc itemDoc= JSONUtil.toBean(sourceAsString,ItemDoc.class);
list.add(itemDoc);
}
long total=hit.getTotalHits().value;
return ItemVO.builder()
.total(total)
.list(list)
.pages(total/(list.size()+1))
.build();
}
}

7.为了保持mysql与es的同步,我选择了最简单的同步双写

在item-service的controller中修改controller方案,当商品上架的时候(status==1),我们把mysql的这条数据写到es中,当商品下架的时候(status==2),我们把es中的数据删除掉。因为es存储没有涉及到库存问题,因此我只是简单的改了改controller层,发生了代码侵入

    @ApiOperation("新增商品,如果status是1就写入es")
@PostMapping
public void saveItem(@RequestBody ItemDTO item) throws IOException {
// 新增
itemService.save(BeanUtils.copyBean(item, Item.class));
if(item.getStatus()==1){
IndexRequest request=new IndexRequest("hmall");
ItemDoc itemDoc = BeanUtils.copyBean(itemService.getById(item.getId()), ItemDoc.class);
request.source(JSONUtil.toJsonStr(itemDoc),XContentType.JSON);
client.index(request, RequestOptions.DEFAULT);
}
} @ApiOperation("更新商品状态,如果是上架,就添加到es中,下架就在es中删除")
@PutMapping("/status/{id}/{status}")
public void updateItemStatus(@PathVariable("id") Long id, @PathVariable("status") Integer status) throws IOException {
Item item = new Item();
item.setId(id);
item.setStatus(status);
itemService.updateById(item);
//1 正常 需上传
if(status==1){
IndexRequest request=new IndexRequest("hmall");
ItemDoc itemDoc = BeanUtils.copyBean(itemService.getById(id), ItemDoc.class);
request.source(JSONUtil.toJsonStr(itemDoc),XContentType.JSON);
client.index(request, RequestOptions.DEFAULT);
}
//2 下架 需删除
else if(status==2||status==3){
DeleteRequest request=new DeleteRequest("hmall",id.toString());
client.delete(request, RequestOptions.DEFAULT);
}
} @ApiOperation("根据id删除商品 同步双删")
@DeleteMapping("{id}")
public void deleteItemById(@PathVariable("id") Long id) throws IOException {
itemService.removeById(id);
// es中也要同步删除
DeleteRequest request=new DeleteRequest("hmall",id.toString());
client.delete(request, RequestOptions.DEFAULT);
}

hmall | 引入ES实现高效搜索与同步双写的更多相关文章

  1. 生产环境高可用centos7 安装配置RocketMQ-双主双从-同步双写(2m-2s-sync)

    添加hosts信息[四台机器] vim /etc/hosts 192.168.119.130 rocketmq-nameserver1 192.168.119.130 rocketmq-master1 ...

  2. Github高效搜索方式

    Github高效搜索方式 文章目录 Github高效搜索方式 0.写在前面 1.常用的搜索功能 1.1 直接搜索 1.2 寻找指定用户|大小的仓库 1.3 搜索仓库 1.4 查找特定star范围的仓库 ...

  3. ElasticSearch核心知识总结(一)es的六种搜索方式和数据分析

    es的六种搜索方式 query string search GET /ecommerce/product/_search //查询所有数据 { "took": 4,//耗费几毫秒 ...

  4. FP6397S5 高效、高频同步DC-DC降压变频器IC

    FP6397是一种高效.高频同步DC-DC降压变频器.100%占空比功能提供了低退出操作,延长了便携式系统的电池寿命. 内部同步开关提高了效率,并消除了对外部肖特基二极管的需要.在停机模式下,输入电源 ...

  5. a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a?(异或解决值互换问题)

    package com.Summer_0424.cn; /** * @author Summer * a,b,c为3个整型变量,在不引入第四个变量的前提下写一个算法实现 a=b b=c c=a? */ ...

  6. a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换

    package com.Summer_0424.cn; /** * @author Summer * a,b为2个整型变量,在不引入第三个变量的前提下写一个算法实现 a与b的值互换? */ publi ...

  7. 新引入thinkphp报错“应用目录[./Application/]不可写,目录无法自动生成! 请手动生成项目目录~”

    新引入thinkphp报错“应用目录[./Application/]不可写,目录无法自动生成! 请手动生成项目目录~”, 其主要原因是文件夹的权限问题,手动将项目文件夹权限更改为可读可写就OK,具体操 ...

  8. 【PHP高效搜索专题(2)】sphinx&coreseek在PHP程序中的应用实例

    PHP可以通过三种途径来调用sphinx 通过Sphinx官方提供的API接口(接口有Python,Java,Php三种版本) 通过安装SphinxSE,然后创建一个中介sphinxSE类型的表,再通 ...

  9. 【PHP高效搜索专题(1)】sphinx&Coreseek的介绍与安装

    我们已经知道mysql中带有"%keyword%"条件的sql是不走索引的,而不走索引的sql在大数据量+大并发量的时候,不仅效率极慢还很有可能让数据库崩溃.那我们如何通过某些关键 ...

  10. github高效搜索使用总结

    swoole 普通搜索 in:name swoole 搜索仓库的名称,搜索仓库名称包含swoole关键字的所有项目 in:description swoole 搜索描述中包含swoole关键字的项目 ...

随机推荐

  1. 视觉族: 基于Stable Diffusion的免费AI绘画图片生成器工具

    视觉族是一款基于Stable Diffusion文生图模型的免费在线AI绘画图片生成器工具,可以使用提示关键词快速生成精美的艺术图片,支持中文提示.无论你是想要创作自己的原创作品,还是想要为你的文字增 ...

  2. Java中的变量分类(按照位置分类)

    变量按位置分 通过上面类的建立我们又得到了新的概念:成员变量和局部变量 成员变量: 可以使用基本数据类型,也可以使用引用数据类型. java中的变量在使用时必须初始化,成员变量可以不对其初始化,系统会 ...

  3. JavaSE print printf println 区别

    *print与println,printf区别 System.out.print();括号内必须含有参数 System.out.println();括号内可以不含参数,此时代表newline即换行; ...

  4. [吐槽]困扰了1周的API调用失败问题的原因是使用了加密DNS

    参考API的官方文档使用postman测试了一下,导入了百度提供的postman环境配置文件,粘贴提供的预处理代码后直接发起请求,响应里提示 "signature is empty" ...

  5. ubuntu server 安装慢 安装卡

    无论是桌面版本ubuntu,还是server 版本,都喜欢在安装过程中联网下东西: 默认的软件包镜像地址下载非常慢,你自身的网络再差点,可能会安装好几个小时. 解决方案: 方案1: 安装前拔网线. 方 ...

  6. C#.NET AES CBC 加密

    重点: 1. KEY 和 IV 转 byte[] 时的编码. 2.要加密的字符串转 byte[] 时的编码. 3.AES 的PADDING,MODE. 4.加密后的byte[] 转字符串时的编码. 先 ...

  7. 指令(Prompt)基本格式

    指令(Prompt)基本格式: 参考信息:包含文心一言完成任务时需要知道的必要背景和材料,如:报告.知识.数据库.对话上下文等 动作:需要文心一言帮你解决的事情,如:撰写.生成.总结.回答等 目标:需 ...

  8. MATLAB神经网络工具箱使用介绍

      本文介绍MATLAB软件中神经网络拟合(Neural Net Fitting)工具箱的具体使用方法.   在MATLAB人工神经网络ANN代码这篇文章中,我们介绍了MATLAB软件中神经网络(AN ...

  9. notonlysuccess大神的线段树完全版

    在大神的网站进不去的时候可以过来看看,另外道客巴巴有个排版比较好的文档,外观派可以去看看http://www.doc88.com/p-2728103209174.html 很早前写的那篇线段树专辑至今 ...

  10. Android 自定义带动画的柱状图

    功能分析 假设要使用柱状图展示用户一周的数据,通用的做法是对接三方图表SDK或者自己通过代码绘制. 1.三方SDK通常包体较大,且定制性差,对特定的UI需求兼容性差; 2.自己绘制,比较复杂,而且要考 ...