索引字段说明v2.md
13.1 KB
索引字段说明 v2
本文档详细说明 search_products 索引的字段结构、类型、数据来源和用途。
索引概述
- 索引名称:
search_products - 索引维度: SPU(Standard Product Unit)级别
- 多租户隔离: 通过
tenant_id字段实现 - Mapping 文件:
mappings/search_products.json
字段分类
1. 基础标识字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
tenant_id |
keyword | 租户ID,用于多租户隔离 | MySQL: shoplazza_product_spu.tenant_id |
spu_id |
keyword | SPU唯一标识 | MySQL: shoplazza_product_spu.id |
create_time |
date | 创建时间 | MySQL: shoplazza_product_spu.created_at |
update_time |
date | 更新时间 | MySQL: shoplazza_product_spu.updated_at |
2. 多语言文本字段
所有文本字段都支持中英文双语,后端根据请求的 language 参数自动选择对应语言字段返回。
2.1 标题字段
| 字段名 | ES类型 | 分析器 | 说明 | 数据来源 |
|---|---|---|---|---|
title_zh |
text | hanlp_index / hanlp_standard | 中文标题 | MySQL: shoplazza_product_spu.title |
title_en |
text | english | 英文标题 | 暂为空(待翻译服务填充) |
2.2 描述字段
| 字段名 | ES类型 | 分析器 | 说明 | 数据来源 |
|---|---|---|---|---|
brief_zh |
text | hanlp_index / hanlp_standard | 中文短描述 | MySQL: shoplazza_product_spu.brief |
brief_en |
text | english | 英文短描述 | 暂为空 |
description_zh |
text | hanlp_index / hanlp_standard | 中文详细描述 | MySQL: shoplazza_product_spu.description |
description_en |
text | english | 英文详细描述 | 暂为空 |
2.3 供应商/品牌字段
| 字段名 | ES类型 | 分析器 | 子字段 | 说明 | 数据来源 |
|---|---|---|---|---|---|
vendor_zh |
text | hanlp_index / hanlp_standard | vendor_zh.keyword (keyword, normalizer: lowercase) |
中文供应商/品牌 | MySQL: shoplazza_product_spu.vendor |
vendor_en |
text | english | vendor_en.keyword (keyword, normalizer: lowercase) |
英文供应商/品牌 | 暂为空 |
用途:
text类型:用于全文搜索(支持模糊匹配)keyword子字段:用于精确匹配过滤和分面聚合
3. 标签字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
tags |
keyword | 标签列表(数组) | MySQL: shoplazza_product_spu.tags(逗号分隔字符串,转换为数组) |
数据格式: ["新品", "热卖", "爆款"]
4. 类目字段
4.1 类目路径(用于搜索)
| 字段名 | ES类型 | 分析器 | 说明 | 数据来源 |
|---|---|---|---|---|
category_path_zh |
text | hanlp_index / hanlp_standard | 中文类目路径(如"服装/男装/衬衫") | MySQL: shoplazza_product_spu.category_path |
category_path_en |
text | english | 英文类目路径 | 暂为空 |
4.2 类目名称(用于搜索)
| 字段名 | ES类型 | 分析器 | 说明 | 数据来源 |
|---|---|---|---|---|
category_name_zh |
text | hanlp_index / hanlp_standard | 中文类目名称 | MySQL: shoplazza_product_spu.category |
category_name_en |
text | english | 英文类目名称 | 暂为空 |
4.3 类目标识(用于过滤和分面)
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
category_id |
keyword | 类目ID | MySQL: shoplazza_product_spu.category_id |
category_name |
keyword | 类目名称(用于过滤) | MySQL: shoplazza_product_spu.category |
category_level |
integer | 类目层级(1/2/3) | MySQL: shoplazza_product_spu.category_level |
category1_name |
keyword | 一级类目名称 | 从 category_path 解析 |
category2_name |
keyword | 二级类目名称 | 从 category_path 解析 |
category3_name |
keyword | 三级类目名称 | 从 category_path 解析 |
用途:
category_path_zh/en,category_name_zh/en: 用于全文搜索,支持模糊匹配category_id,category_name,category_level,category1/2/3_name: 用于精确过滤和分面聚合
5. 规格字段(Specifications)
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
specifications |
nested | 规格列表(嵌套对象数组) | MySQL: shoplazza_product_option + shoplazza_product_sku.option1/2/3 |
嵌套结构:
{
"specifications": [
{
"sku_id": "sku_123",
"name": "color",
"value": "white"
},
{
"sku_id": "sku_123",
"name": "size",
"value": "256GB"
}
]
}
数据来源:
name: 从shoplazza_product_option表获取(选项名称,如"color"、"size")value: 从shoplazza_product_sku表的option1,option2,option3字段获取(选项值,如"white"、"256GB")sku_id: SKU ID,用于关联
API 过滤示例:
{
"query": "手机",
"filters": {
"specifications": {
"name": "color",
"value": "white"
}
}
}
多个规格过滤(OR逻辑):
{
"query": "手机",
"filters": {
"specifications": [
{"name": "color", "value": "white"},
{"name": "size", "value": "256GB"}
]
}
}
ES 查询结构(后端自动生成):
{
"nested": {
"path": "specifications",
"query": {
"bool": {
"must": [
{ "term": { "specifications.name": "color" } },
{ "term": { "specifications.value": "white" } }
]
}
}
}
}
API 分面示例:
所有规格名称的分面:
{
"query": "手机",
"facets": ["specifications"]
}
指定规格名称的分面:
{
"query": "手机",
"facets": ["specifications.color", "specifications.size"]
}
ES 聚合结构(后端自动生成):
所有规格名称:
{
"aggs": {
"specifications_facet": {
"nested": { "path": "specifications" },
"aggs": {
"by_name": {
"terms": { "field": "specifications.name", "size": 20 },
"aggs": {
"value_counts": {
"terms": { "field": "specifications.value", "size": 10 }
}
}
}
}
}
}
}
指定规格名称:
{
"aggs": {
"specifications_color_facet": {
"nested": { "path": "specifications" },
"aggs": {
"filter_by_name": {
"filter": { "term": { "specifications.name": "color" } },
"aggs": {
"value_counts": {
"terms": { "field": "specifications.value", "size": 10 }
}
}
}
}
}
}
}
6. 选项名称字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
option1_name |
keyword | 选项1名称(如"color") | MySQL: shoplazza_product_option |
option2_name |
keyword | 选项2名称(如"size") | MySQL: shoplazza_product_option |
option3_name |
keyword | 选项3名称 | MySQL: shoplazza_product_option |
7. 价格字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
min_price |
float | 最低价格 | 从所有 SKU 价格计算 |
max_price |
float | 最高价格 | 从所有 SKU 价格计算 |
compare_at_price |
float | 原价/对比价 | MySQL: shoplazza_product_spu.compare_at_price |
sku_prices |
float | 所有 SKU 价格列表(数组) | 从所有 SKU 价格汇总 |
8. 重量字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
sku_weights |
long | 所有 SKU 重量列表(数组) | 从所有 SKU 重量汇总 |
sku_weight_units |
keyword | 所有 SKU 重量单位列表(数组) | 从所有 SKU 重量单位汇总 |
9. 库存字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
total_inventory |
long | 总库存(所有 SKU 库存之和) | 从所有 SKU 库存汇总 |
10. SKU 嵌套字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
skus |
nested | SKU 详细信息列表(嵌套对象数组) | MySQL: shoplazza_product_sku |
嵌套结构:
{
"skus": [
{
"sku_id": "sku_123",
"price": 99.99,
"compare_at_price": 149.99,
"sku_code": "SKU001",
"stock": 100,
"weight": 0.5,
"weight_unit": "kg",
"option1_value": "white",
"option2_value": "256GB",
"option3_value": null,
"image_src": "https://example.com/image.jpg"
}
]
}
字段说明:
sku_id: SKU 唯一标识price: SKU 价格compare_at_price: SKU 原价sku_code: SKU 编码stock: 库存数量weight: 重量weight_unit: 重量单位option1_value,option2_value,option3_value: 选项值(对应option1_name,option2_name,option3_name)image_src: SKU 图片地址(index: false,仅用于返回)
11. 图片字段
| 字段名 | ES类型 | 说明 | 数据来源 |
|---|---|---|---|
image_url |
keyword | 主图URL(index: false,仅用于返回) |
MySQL: shoplazza_product_spu.image_url |
12. 向量字段(不返回给前端)
| 字段名 | ES类型 | 维度 | 说明 | 数据来源 |
|---|---|---|---|---|
title_embedding |
dense_vector | 1024 | 标题向量(用于语义搜索) | 由 BGE-M3 模型生成 |
image_embedding |
nested | - | 图片向量(用于图片搜索) | 由 CN-CLIP 模型生成 |
注意: 这些字段仅用于搜索,不会返回给前端。
字段用途总结
搜索字段(参与相关性计算)
title_zh,title_en(boost: 3.0)brief_zh,brief_en(boost: 1.5)description_zh,description_en(boost: 1.0)vendor_zh,vendor_en(boost: 1.5)tags(boost: 1.0)category_path_zh,category_path_en(boost: 1.5)category_name_zh,category_name_en(boost: 1.5)title_embedding(向量召回,boost: 0.2)
过滤字段(精确匹配)
tenant_id(必需,多租户隔离)category_id,category_name,category1_name,category2_name,category3_namevendor_zh.keyword,vendor_en.keywordspecifications(嵌套查询)min_price,max_price(范围过滤)
分面字段(聚合统计)
category1_name,category2_name,category3_namespecifications(所有规格名称的分面,嵌套聚合,按 name 分组,然后按 value 聚合)specifications.{name}(指定规格名称的分面,如specifications.color,只返回该 name 的 value 列表)
返回字段(前端展示)
除 title_embedding 和 image_embedding 外,所有字段都会根据 language 参数自动选择对应的中英文字段返回。
数据映射规则
多语言字段映射
后端根据请求的 language 参数(zh 或 en)自动选择:
language="zh": 优先返回*_zh字段,如果为空则回退到*_en字段language="en": 优先返回*_en字段,如果为空则回退到*_zh字段
映射到前端字段:
title_zh/en→titlebrief_zh/en→briefdescription_zh/en→descriptionvendor_zh/en→vendorcategory_path_zh/en→category_pathcategory_name_zh/en→category_name
规格数据构建
- 从
shoplazza_product_option表获取选项名称(option1_name,option2_name,option3_name) - 从
shoplazza_product_sku表获取选项值(option1,option2,option3) - 将每个 SKU 的选项组合构建为
specifications数组:python for sku in skus: if sku.option1 and option1_name: specifications.append({ "sku_id": sku.id, "name": option1_name, # 如"color" "value": sku.option1 # 如"white" }) # 同样处理 option2, option3
查询架构
查询结构
filters AND (text_recall OR embedding_recall)
- filters: 前端传递的过滤条件(永远起作用)
- text_recall: 文本相关性召回(同时搜索中英文字段)
- embedding_recall: 向量召回(KNN)
- function_score: 包装召回部分,支持提权字段(新鲜度、销量等)
文本召回字段
默认同时搜索以下字段(中英文都包含):
title_zh^3.0,title_en^3.0brief_zh^1.5,brief_en^1.5description_zh^1.0,description_en^1.0vendor_zh^1.5,vendor_en^1.5category_path_zh^1.5,category_path_en^1.5category_name_zh^1.5,category_name_en^1.5tags^1.0
注意事项
- 索引维度: 所有数据以 SPU 为单位索引,SKU 信息作为嵌套字段存储
- 多租户隔离: 所有查询必须包含
tenant_id过滤条件 - 多语言支持: 文本字段支持中英文,后端根据
language参数自动选择 - 规格分面:
specifications使用嵌套聚合,按name分组,然后按value聚合 - 向量字段:
title_embedding和image_embedding仅用于搜索,不返回给前端