商品上架:SKU在ES中存储模型分析


腾讯云的截图:

============================

把后台vue项目和谷粒商城的java项目跑起来:

cnpm install一下

npm run dev 跑起来:

还是有错误。。。。

百度后说,删除node_modules 然后重新npm install

npm install 这个命令也报错了。。

cnpm install :

ok  了,再次npm run dev跑:

ok 可以运行了。

后台跑起来,nacos打开,虚拟机搞开。。

spu ===规格   

SPU是标准化产品单元,区分品种;SKU是库存量单位,区分单品;

分析下在ES中保存什么?ES毕竟是存在内存中,理论上集群扩展但是成本高,所以还是合理点好。

 假设用这种存储方式,attr指的就是规格,也就是SPU

 

 第二种方式,存两个索引,这样就不冗余,但是存在问题:

假设检索的时候,10000个SKU ,其中有规格4000个,每次都要分布查询规格,差规格的话,4000个,long 的话大概就是320M ,用户多了就是几十个G,就很慢了。

所以上面第一种空间浪费了,但是时间减少了。

PUT product
{
    "mappings":{
        "properties": {
            "skuId":{
                "type": "long"
            },
            "spuId":{
                "type": "keyword"
            },
            "skuTitle": {
                "type": "text",
                "analyzer": "ik_smart"
            },
            "skuPrice": {
                "type": "keyword"
            },
            "skuImg":{
                "type": "keyword",
                "index": false,
                "doc_values": false
            },
            "saleCount":{
                "type":"long"
            },
            "hasStock": {
                "type": "boolean"
            },
            "hotScore": {
                "type": "long"
            },
            "brandId": {
                "type": "long"
            },
            "catalogId": {
                "type": "long"
            },
            "brandName": {
                "type": "keyword",
                "index": false,
                "doc_values": false
            },
            "brandImg":{
                "type": "keyword",
                 "index": false,
                "doc_values": false
            },
            "catalogName": {
                "type": "keyword",
                "index": false,
                "doc_values": false
            },
            "attrs": {
                "type": "nested",
                "properties": {
                    "attrId": {
                        "type": "long"
                    },
                    "attrName": {
                        "type": "keyword",
                        "index": false,
                        "doc_values": false
                    },
                    "attrValue": {
                        "type": "keyword"
                    }
                }
            }
        }
    }
}

  最终确定的索引的映射就如上。

注意 attr属性标注成了:nested 

===========================

在es中 nested 叫做嵌入式的。

如果是数组类型的字段,es会做扁平化处理:

比如,存储:

 会被ES解析成:

这样会出现什么问题呢,就是比如,要访问 alice smith,  但是一开始又没有存储这个数据,如果检索,扁平化处理就会检索到。

如果加了nested  就不会被检索到。