学习笔记(11)商品上架与ES检索

学习笔记(11)商品上架与ES检索

商品上架

商品里有很多SKU:

在这里插入图片描述

每个SKU有自己的销售属性:
在这里插入图片描述

除此之外,每个商品有共用的商品属性:

在这里插入图片描述

检索出来的界面标题是SPU+SKU都有

查询商品的详情

SPU的信息拿来筛选,SKU的信息拿来售卖
在这里插入图片描述

SELECT pav.*,pa.`name` FROM `pms_product_attribute_value` pav 
	LEFT JOIN `pms_product_attribute` pa
	ON pa.`id` = pav.`product_attribute_id`
WHERE pav.`product_id` =23

上架5号

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

dubbo集群容错

查询多试验几次,增删改要快速失败。选择dubbo的快速失败模式


在这里插入图片描述

dubbo配置默认在服务上,调不精细

CudSerivce:增删改service
* RService:读service
*
*1)、dubbo的默认集群容错哪几种,怎么做?
* failover/failfast/failsafe/failback/forking;
* @Service注解上一配置就行。
目前本系统未按此设计
* 改掉默认的mapping信息;
* 1)、改掉不分词的字段
* 2)、整个info就是ESProduct,//嵌入式对象的Mapping一定要用nested声明,这样才能正确的检索到数据
不分词用keyword

在这里插入图片描述

什么需要评分:只有在搜索框搜的关键字需要评分

 /**
     * 给数据库插入数据
     * 1)、dubbo远程调用插入数据服务,可能经常超时。dubbo默认会重试
     * 导致这个方法会被调用多次。可能导致数据库同样的数据有多个。
     *
     * 2)、dubbo有自己默认的集群容错。
     *
     * 给数据库做数据的,最好用dubbo的快速失败模式。我们手工重试
     *
     * @param id
     */
    private void saveProductToEs(Long id) {
        //1、查出商品的基本新
        Product productInfo = productInfo(id);
        EsProduct esProduct = new EsProduct();


        //1、复制基本信息
        BeanUtils.copyProperties(productInfo,esProduct);


        //2、复制sku信息,对于es要保存商品信息,还要查出这个商品的sku,给es中保存
        List<SkuStock> stocks = skuStockMapper.selectList(new QueryWrapper<SkuStock>().eq("product_id", id));
        List<EsSkuProductInfo> esSkuProductInfos = new ArrayList<>(stocks.size());

 //       List<EsProductAttributeValue> skuAttributeNames = productAttributeValueMapper.selectProductSaleAttrName(id);
//        List<EsProductAttributeValue> attributeValues = productAttributeValueMapper.selectProductBaseAttrAndValue(id);
        //查出当前商品的sku属性  颜色  尺码
        List<ProductAttribute>  skuAttributeNames = productAttributeValueMapper.selectProductSaleAttrName(id);
        stocks.forEach((skuStock)->{
            EsSkuProductInfo info = new EsSkuProductInfo();
            BeanUtils.copyProperties(skuStock,info);

            //闪亮 黑色
            String subTitle = esProduct.getName();
            if(!StringUtils.isEmpty(skuStock.getSp1())){
                subTitle+=" "+skuStock.getSp1();
            }
            if(!StringUtils.isEmpty(skuStock.getSp2())){
                subTitle+=" "+skuStock.getSp2();
            }
            if(!StringUtils.isEmpty(skuStock.getSp3())){
                subTitle+=" "+skuStock.getSp3();
            }
            //sku的特色标题
            info.setSkuTitle(subTitle);
            List<EsProductAttributeValue> skuAttributeValues = new ArrayList<>();

            for (int i=0;i<skuAttributeNames.size();i++){
                //skuAttr 颜色/尺码
                EsProductAttributeValue value = new EsProductAttributeValue();

                value.setName(skuAttributeNames.get(i).getName());
                value.setProductId(id);
                value.setProductAttributeId(skuAttributeNames.get(i).getId());
                value.setType(skuAttributeNames.get(i).getType());

                //颜色   尺码;让es去统计‘;改掉查询商品的属性分类里面所有属性的时候,按照sort字段排序好
                if(i==0){
                    value.setValue(skuStock.getSp1());
                }
                if(i==1){
                    value.setValue(skuStock.getSp2());
                }
                if(i==2){
                    value.setValue(skuStock.getSp3());
                }

                skuAttributeValues.add(value);

            }


            info.setAttributeValues(skuAttributeValues);
            //sku有多个销售属性;颜色,尺码
            esSkuProductInfos.add(info);
            //查出销售属性的名

        });

        esProduct.setSkuProductInfos(esSkuProductInfos);


        List<EsProductAttributeValue> attributeValues = productAttributeValueMapper.selectProductBaseAttrAndValue(id);
        //3、复制公共属性信息,查出这个商品的公共属性
        esProduct.setAttrValueList(attributeValues);

        try {
            //把商品保存到es中
            Index build = new Index.Builder(esProduct)
                    .index(EsConstant.PRODUCT_ES_INDEX)
                    .type(EsConstant.PRODUCT_INFO_ES_TYPE)
                    .id(id.toString())
                    .build();
            DocumentResult execute = jestClient.execute(build);
            boolean succeeded = execute.isSucceeded();
            if(succeeded){
                log.info("ES中;id为{}商品上架完成",id);
            }else {
                log.error("ES中;id为{}商品未保存成功,开始重试",id);
                //saveProductToEs(id);
            }
        }catch (Exception e){
            log.error("ES中;id为{}商品数据保存异常;{}",id,e.getMessage());
            //saveProductToEs(id);
        }

    }

1.对于数据库是修改商品的状态位

2.对于es要保存的商品信息

mybatis-plus自带的更新方法是哪个字段有值就更哪个字段(所以所有类型应该用包装类,因为非包装类有默认值)

我们上架的是SKU(仿京东,一些小的商城系统,比如小米,上架的是SPU,之后自己选)

上下架请求:

在这里插入图片描述

对于数据库是修改商品的状态位

对于es要保存商品信息

商品的属性分类如下:

在这里插入图片描述

SKU有其基本信息,又有销售属性

javaBean应该都去用包装类型

public void setProductPublishStatus(Integer publishStatus, Long id) {
    //javaBean应该都去用包装类型
    Product product = new Product();
    //默认所有属性为null
    product.setId(id);
    product.setPublishStatus(publishStatus);
    //mybatis-plus自带的更新方法是哪个字段有值就更哪个字段
    productMapper.updateById(product);
}

es也会占用硬盘空间 ,同步

检索服务

分布式系统下,session不一致,前端第一次请求到达x服务器上,下回请求来到y服务器,就取不出来了,session不一致

后端解决session不一致问题麻烦,但是前端解决容易,访问来访问去就是浏览器。

gmall-shop-portal: 和前端公众访问的商品项目进行对接的web

聚合

第一步:分析页面会传入哪些参数,可以把所有参数写成一个javaBean

第二步:要把哪些结果返回去

/**
 * 检索前端传递的数据
 */
@Data
public class SearchParam implements Serializable {
@Data
public class SearchResponse implements Serializable {

    private SearchResponseAttrVo brand;//品牌
    private SearchResponseAttrVo catelog;//分类
    //所有商品的顶头显示的筛选属性
    private List<SearchResponseAttrVo> attrs = new ArrayList<SearchResponseAttrVo>();

    //检索出来的商品信息
    private List<EsProduct> products = new ArrayList<EsProduct>();

    private Long total;//总记录数
    private Integer pageSize;//每页显示的内容
    private Integer pageNum;//当前页面


}

在这里插入图片描述

每个 SearchResponseAttrVo相当于上图的一行

启动前端项目:npm install

web服务是消费者

在这里插入图片描述

前端查询发来search请求

public class SearchProductServiceImpl implements SearchProductService {
    @Autowired
    JestClient jestClient;

    @Override
    public SearchResponse searchProduct(SearchParam searchParam) {
        //1、构建检索条件
        String dsl = buildDsl(searchParam);

        log.error("商品检索的详细数据{}",dsl);


        Search search = new Search.Builder(dsl).addIndex(EsConstant.PRODUCT_ES_INDEX)
                .addType(EsConstant.PRODUCT_INFO_ES_TYPE)
                .build();

        SearchResult execute = null;
        try {
            //2、检索
            execute = jestClient.execute(search);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //3、将返回的SearchResult转为SearchResponse
        SearchResponse searchResponse = buildSearchResponse(execute);


        searchResponse.setPageNum(searchParam.getPageNum());
        searchResponse.setPageSize(searchParam.getPageSize());

        return searchResponse;
    }

聚合三大聚,分别为品牌聚,分类聚,属性聚

已标记关键词 清除标记
一、课程简介 随着技术的飞速发展,经过多年的数据积累,各互联网公司已保存了海量的原始数据和各种业务数据,所以数据仓库技术是各大公司目前都需要着重发展投入的技术领域。数据仓库是面向分析的集成化数据环境,为企业所有决策制定过程,提供系统数据支持的战略集合。通过对数据仓库中数据的分析,可以帮助企业改进业务流程、控制成本、提高产品质量等。 二、课程内容 本次精心打造的数仓项目的课程,从项目架构的搭建,到数据采集模块的设计、数仓架构的设计、实战需求实现、即席查询的实现,我们针对国内目前广泛使用的Apache原生框架和CDH版本框架进行了分别介绍,Apache原生框架介绍中涉及到的技术框架包括Flume、Kafka、Sqoop、MySql、HDFS、Hive、Tez、Spark、Presto、Druid等,CDH版本框架讲解包括CM的安装部署、Hadoop、Zookeeper、Hive、Flume、Kafka、Oozie、Impala、HUE、Kudu、Spark的安装配置,透彻了解不同版本框架的区别联系,将大数据全生态系统前沿技术一网打尽。在过程中对大数据生态体系进行了系统的讲解,对实际企业数仓项目中可能涉及到的技术点都进行了深入的讲解和探讨。同时穿插了大量数仓基础理论知识,让你在掌握实战经验的同时能够打下坚实的理论基础。 三、课程目标 本课程以国内电商巨头实际业务应用场景为依托,对电商数仓的常见实战指标以及难点实战指标进行了详尽讲解,具体指标包括:每日、周、月活跃设备明细,留存用户比例,沉默用户、回流用户、流失用户统计,最近连续3周活跃用户统计,最近7天内连续3天活跃用户统计,GMV成交总额分析,转化率及漏斗分析,品牌复购率分析、订单表拉链表的设计等,让学生拥有更直观全面的实战经验。通过对本课程的学习,对数仓项目可以建立起清晰明确的概念,系统全面的掌握各项数仓项目技术,轻松应对各种数仓难题。 四、课程亮点 本课程结合国内多家企业实际项目经验,特别加入了项目架构模块,从集群规模的确定到框架版本选型以及服务器选型,手把手教你从零开始搭建大数据集群。并且总结大量项目实战中会遇到的问题,针对各个技术框架,均有调优实战经验,具体包括:常用Linux运维命令、Hadoop集群调优、Flume组件选型及性能优化、Kafka集群规模确认及关键参数调优。通过这部分学习,助学生迅速成长,获取前沿技术经验,从容解决实战问题。
课程目标 从零开始掌握Premiere影视剪辑的基础知识,学会视频剪辑+影视特效+视频调色+字幕制作 适用人群 PR零基础小白,在校大学生,职场新人,想成为影视剪辑、影视后期、短视频制作、自媒体等高手的朋友。 课程简介 课程以新版PR 2020讲解,可使用PR任意版本学习,绝大多数功能兼容旧版,但强烈建议使用新版本。 【Adobe认证专家讲师精耕细作精品教程,非学院派照本宣科软件操作教程,以任务为导向,面向实际应用场景,每一章都能学会实打实的高手技能,讲解细致,小白也能轻松入门成大神!】 课程好不好,看过就知道,前面的免费章节欢迎试看。 本课程学习不需要任何PR基础,只需要电脑操作基础即可。兼容Windows和Mac操作系统,同时讲解两种系统下的快捷键操作,不用担心操作上的障碍问题。 课程特色 1、以实际PR影视编辑与特效的流程为导向,绝大多数内容都是为了完成某个具体任务,而不是为了讲解某个软件操作而凑数。 2、不同于国内多数教程和书籍,每个知识点务求讲精、讲透,帮助你掌握PR的精髓,而非软件操作上的皮毛,让你真正学到PR的本质,一次学习,终身受用,少走弯路,节约生命。 3、课程会随PR新版本的推出持续更新,不必担心有新功能却不知道怎么用。 4、充足的练习题和作业题,让你在不断的练习和挑战中提升PR技能。
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页