根据商城首页需求编写ES映射

在编写ES映射前先看看JD商城的检索页面,然后根据这个页面编写自己的检索映射,对于这些品牌,品牌属性和所属分类都是要保存的
根据商城首页需求编写ES映射_第1张图片
下面这些手机就是根据上面条件检索出来的
根据商城首页需求编写ES映射_第2张图片

ES数据结构的编写

那一个检索的实体中,需要哪些信息呢?哪些是需要被检索的,哪些又是不需要被检索的,哪些能进行模糊匹配,哪些不能进行模糊匹配,以及哪些能够进行内部匹配(嵌入式,扁平化处理,防止数据扁平化搜索)等等

实体数据结构的思考过程

下面先大致来拆解一下具体商品的数据结构(以手机为例,具体的信息都是查出来的)
第一种方案

{
	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;
    }


}

虽然这种方式可能导致大量存储,但是保证了性能!

你可能感兴趣的:(Elasticsearch)