在编写ES映射前先看看JD商城的检索页面,然后根据这个页面编写自己的检索映射,对于这些品牌,品牌属性和所属分类都是要保存的
下面这些手机就是根据上面条件检索出来的
那一个检索的实体中,需要哪些信息呢?哪些是需要被检索的,哪些又是不需要被检索的,哪些能进行模糊匹配,哪些不能进行模糊匹配,以及哪些能够进行内部匹配(嵌入式,扁平化处理,防止数据扁平化搜索)等等
下面先大致来拆解一下具体商品的数据结构(以手机为例,具体的信息都是查出来的)
第一种方案
{
skuId
spuId
skuTitle
price
saleCount
attrs:[
{尺寸}
{CPU}
{分辨率}
]
}
对于上面的结构:简单方便,不用多次查找,内存占用比较大,因为冗余信息太多了,比如在一个SPU下的基本属性都是相同的不用再重复的存储。
第二种方案:拆分索引
sku索引
{
skuId
spuId
xxxx
}
attr索引
{
spuId
attrs:[
{尺寸}
......
]
}
就相当于Mysql中的分表,将一个大表分为多个小表,根据某些字段进行连表查询。
对应上面的结构:节省内存空间,结构相对于第一种复杂,检索商品时要多次查询才能完成,因此在大数据环境下效率较低
采用第一种方案编写ES映射
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"
}
}
}
}
}
}
Java类
package com.wrial.to.es;
/*
* @Author Wrial
* @Date Created in 12:06 2020/5/19
* @Description
*/
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class SkuEsModel {
private Long skuId;
private Long spuId;
private String skuTitle;
private BigDecimal skuPrice;
private String skuImg;
private Long saleCount;
private Boolean hasStock;
private Long hotScore;
private Long brandId;
private Long catalogId;
private String catalogName;
private String brandName;
private String brandImg;
private List attrs;
@Data
public static class Attrs{
private Long attrId;
private String attrName;
private String attrValue;
}
}
虽然这种方式可能导致大量存储,但是保证了性能!