Mall商城的高级篇的开发
项目的整体架构图
实现全文检索和日志分析
在本项目中,全文检索使用ElasticSearch
来做全文检索。
做日志存储和日志检索(日志的快速定位)使用ELK(ElasticSearch+Kibana+LogStash).
比如,腾讯云的ES服务器利用LogStash
来进行数据传输汇聚到我们的ES
中进行存储和异常定位与监控。
他会收集我们项目中日志,包括前台服务和后台服务,还有第三方的中间件
实现全文检索
流程是这样:在我们后台管理系统中对应着有SPU管理,有一个商品上架的功能。
通过点击商品的上架功能,我们的后台服务器将改商品的所有属性传给我们的ES服务器并在ES服务器保存(index),之后在实现我们的全文检索的功能。
其中保存商品的数据,不是说将商品的所有信息都保存在ES服务器,主要的原因是ES服务器保存的数据都在内存中,内存相对硬盘,性价比还是相差很大。
SKU在ES中的存储模型分析
当然在ES服务器中保存的是JSON数据,基于此,我们约定好需要检索的内容。
{
"skuId":"1",
"spuId":"11"
"skuTitle":"Apple xx",
"price":"99",
"seleCount":"990"
"attrs":[
{"尺寸":"xx"},
{"CPU":"xx"},
{"分辨率":""},
]
}
这样进行存储,很容易产生冗余字段。但是呢,这样检索起来方便。这个是利用空间换时间。
其实呢,为了减少冗余字段,因为每个商品的属性有的就是一样。
sku索引{
"skuId":"1",
"skuTitle":"Apple xx",
"price":"99",
"seleCount":"990"
}
attr索引{
"spuId":"11",
"attrs":[
{"尺寸":"xx"},
{"CPU":"xx"},
{"分辨率":""}
]
}
这个使用时间换空间。
最后我们还是选择浪费时间少的存储模型。
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_value"
},
"saleCount":{ "type":"long" },
"hasStock": { "type": "boolean" },
"hotScore": { "type": "long" },
"brandId": { "type": "long" },
"catalogId": { "type": "long" },
"brandName": {"type": "keyword"}, # 视频中有false
"brandImg":{
"type": "keyword",
"index": false, # 不可被检索,不生成index,只用做页面使用
"doc_values": false # 不可被聚合,默认为true
},
"catalogName": {"type": "keyword" }, # 视频里有false
"attrs": {
"type": "nested",
"properties": {
"attr