SPU-SKU索引方案选型
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,只取最高分,避免累加。 其他重点字段
Sku title
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 索引方法 设计要求:
- 支持facet(精确过滤、keyword聚合),并且性能需要足够高。
- 支持普通搜索模糊匹配(用户原始query可能包括分类词)。
- 模糊匹配要考虑多语言 方案:采用方案2
- categoryPath索引 + Prefix 查询(categoryPath.keyword: "服装/男装")(如果满足条件的key太多的则性能较差,比如 查询的是一级类目,类目树叶子节点太多时性能较差)
- 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" },
tags 3.1 数据源 多值 标签 最多输入250个标签,每个不得超过500字符,多个标签请用「英文逗号」隔开 新品,热卖,爆款 耳机,头戴式,爆款
分割后 list形式灌入 3.2 Mysql 3.3 ES索引 3.3.1 输入数据 3.3.2 索引方法
- 供应商 4.1 数据源 4.2 Mysql 4.3 ES索引 4.3.1 输入数据 4.3.2 索引方法
- 款式/选项值(options)
5.1 数据源
以下区域字段,商品属性为M(商品主体)的行需填写款式名称,商品属性为P(子款式)的行需填写款式值信息,商品属性为S(单一款式商品)的行无需填写
款式1 款式2 款式3 最多255字符 最多255字符 最多255字符 SIZE COLOR
S red
... 5.2 Mysql - API 在 SPU 的维度直接返回3个属性定义,存储在 shoplazza_product_option 中:
- 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 } } } } } } } }