1.会在日志与商品全文检索中使用到es,日志部分后面再说 下面会说 商品的全文检索
2.如下全文检索将会用es而不是mysql,为什么呢
1.mysql全文检索没有es强大
2.es中数据保存在内存中,性能会比mysql优很多,当内存不够的时候咋办呢,分片,支持分布式,容量无限,
但是设计的时候还是尽量要节省,因为内存产品比硬盘要贵很多
3.存储模型的分析与确定
将数据从mysql保存到es称为上架
上架的商品才可以在网站上被展示与检索
以下是一个我们检索大致需要的属性的列举,第一种每一条数据中sku与attrs放在同一对象中,
第二条sku与attrs 封装成了不同对象,两者的优劣分析:
第一种会有数据冗余,但是不用进行二次检索,第二种没有数据冗余但要进行二次检索。
最终我们是采用第一种,使用空间换时间的方式,何况使用第二种当数据量大时会极大的消耗运行内存引起各种问题
最终数据模型具体确定为如下, kibana中执行
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"
},
"catelogId": {
"type": "long"
},
"brandName": {
"type": "keyword",
"index": false,
"doc_values": false
},
"brandImg": {
"type": "keyword",
"index": false,
"doc_values": false
},
"catelogName": {
"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"
}
}
}
}
}
}
bejson中生成的javabean
@Data
public class SkuEsModel {
//商品ID
private Long spuId;
//sku_id
private Long skuId;
//标题
private String skuTitle;
//价格
private BigDecimal skuPrice;
//图片
private String skuImg;
//销售量
private Long saleCount;
//是否还有库存
private Boolean hasStock;
//热度评分
private Long hotScore;
//品牌ID
private Long brandId;
//品牌名
private String brandName;
//品牌图片
private String brandImg;
//分类ID
private Long catalogId;
//分类名
private String catalogName;
//属性
private List<Attrs> attrs;
@Data
public static class Attrs {
//属性ID
private Long attrId;
//属性名
private String attrName;
//属性值
private String attrValue;
}
}