索引字段说明v2.md 5.45 KB

SPU-SKU索引方案选型

  1. spu为单位。SKU字段展开作为SPU属性 1.1 索引方案 除了title, brielf description seo相关 cate tags vendor所有影响相关性的字段都在spu。 sku只有款式、价格、重量、库存等相关属性。所以,可以以spu为单位建立索引。 sku中需要参与搜索的属性(比如价格、库存)展开到spu。 sku的所有需要返回的字段作为nested字段,仅用于返回。

    写入 spu 级别索引

    def build_product_document(product, variants): return { "spu_id": str(product.id), "title": product.title,

    # Variant搜索字段(展开)
    # 价格(int)、重量(int)、重量单位拼接重量(keyword),都以list形式灌入
    # TODO 按要求补充
    
    # 库存总和 将sku的库存加起来作为一个值灌入
    # 售价,灌入3个字段,一个 sku价格 以list形式灌入,一个最高价一个最低价
    # TODO 按要求补充
    
    # Variant详细信息(用于返回)
    "variants": [
        {
            "sku_id": str(v.id),
            "price": float(v.price),
            "options": v.options
        }
        for v in variants
    ],
    
    "min_price": min(v.price for v in variants),
    "max_price": max(v.price for v in variants)
    

    } 1.2 查询方案 对数组字段使用 dis_max,只取最高分,避免累加。 其他重点字段

  2. Sku title

  3. category 2.1 Mysql 在spu表中: Field Type category varchar(255) category_id bigint(20) category_google_id bigint(20) category_level int(11) category_path varchar(500) 2.2 ES索引 2.2.1 输入数据 设计 1,2,3级分类 三个字段,的 category (原始文本) 2.2.2 索引方法 设计要求:

    1. 支持facet(精确过滤、keyword聚合),并且性能需要足够高。
    2. 支持普通搜索模糊匹配(用户原始query可能包括分类词)。
    3. 模糊匹配要考虑多语言 方案:采用方案2
    4. categoryPath索引 + Prefix 查询(categoryPath.keyword: "服装/男装")(如果满足条件的key太多的则性能较差,比如 查询的是一级类目,类目树叶子节点太多时性能较差)
    5. categoryPath支撑模糊查询 和 多级cate keyword索引支撑精确查询。 索引阶段冗余,查询性能高。 "category_path_zh": { // 提供模糊查询功能,辅助相关性计算 "type": "text", "analyzer": "hanlp_index", "search_analyzer": "hanlp_standard" }, "category_path_en": { // 提供模糊查询功能,辅助相关性计算 "type": "text", "analyzer": "english", "search_analyzer": "english" }, "category_path": { // 用于多层级的筛选、精确匹配 "type": "keyword", "normalizer": "lowercase"
      }, "category_id": { "type": "keyword" }, "category_name": { "type": "keyword" }, "category_level": { "type": "integer" }, "category1_name": { // 不同层级下 可能有同名的情况,因此提供一二三级分开的查询方式 "type": "keyword" }, "category2_name": { "type": "keyword" }, "category3_name": { "type": "keyword" },
  4. tags 3.1 数据源 多值 标签 最多输入250个标签,每个不得超过500字符,多个标签请用「英文逗号」隔开 新品,热卖,爆款 耳机,头戴式,爆款

分割后 list形式灌入 3.2 Mysql 3.3 ES索引 3.3.1 输入数据 3.3.2 索引方法

  1. 供应商 4.1 数据源 4.2 Mysql 4.3 ES索引 4.3.1 输入数据 4.3.2 索引方法
  2. 款式/选项值(options) 5.1 数据源 以下区域字段,商品属性为M(商品主体)的行需填写款式名称,商品属性为P(子款式)的行需填写款式值信息,商品属性为S(单一款式商品)的行无需填写
    款式1 款式2 款式3 最多255字符 最多255字符 最多255字符 SIZE COLOR
    S red
    ... 5.2 Mysql
  3. API 在 SPU 的维度直接返回3个属性定义,存储在 shoplazza_product_option 中:
  4. API在 SKU的维度直接返回3个属性值,存储在 shoplazza_product_sku 表的 option 相关的字段中: 5.3 ES索引

"specifications": { "type": "nested", "properties": { "name": { "type": "keyword" }, // "颜色", "容量" "value": { "type": "keyword" } // "白色", "256GB" } },

另外还需要包含一个单独的字段,main_option (即店铺主题装修里面配置的 颜色切换 - 变体名称,也就是列表页商品的子sku显示维度) "main_option": { "type": "keyword" } 查询指定款式 { "query": { "nested": { "path": "specifications", "query": { "bool": { "must": [ { "term": { "specifications.name ": "颜色" } }, { "term": { "specifications.value": "绿色" } } ] } } } } } 按 name 做分面搜索(聚合)

{ "aggs": { "specs": { "nested": { "path": "specifications" }, "aggs": { "by_name": { "terms": { "field": "specifications.name", "size": 20 }, "aggs": { "value_counts": { "terms": { "field": "specifications.value", "size": 10 } } } } } } } }