我有一个电商系统, 物品上架系统因为描述有大小写不同, 相同物品上架了两次, 如何改进系统?
这是一个非常典型、而且“成熟系统一定会踩到”的问题。可以从技术层、业务层、流程层三个维度系统性改进,而不是只做“字符串转小写”这种补丁式修复。
一、问题本质拆解
你现在遇到的不是“大小写问题”,而是:
“物品唯一性定义不清 + 去重策略缺失”
大小写不同只是触发点,真正的问题是系统 没有一个权威的、机器可判等价的商品标识(Canonical Identity)。
二、改进目标(先定原则)
一个健壮的电商上架系统,至少要满足:
同一“物理/逻辑商品”只能有一个主商品
文本差异 ≠ 商品差异
去重逻辑是系统能力,不依赖人工规范
历史脏数据可治理,而不是永久背锅
三、分层改进方案(由浅入深)
1? 技术底线改进(必须做)
1.1 统一规范化(Normalization)
对参与“唯一性判断”的字段,建立规范化表示(canonical form):
原始描述: "Apple iPhone 15 Pro Max 256GB Black"
规范化后: "apple iphone 15 pro max 256gb black"
规范化规则建议包括:
规则 示例
大小写统一 toLowerCase
全角半角 A → A
去多余空格 多空格 → 单空格
标点归一 - / _ → 空格
Unicode 归一 NFC / NFKC
? 注意:
? 规范化是“输入处理”,不是业务判断。
1.2 数据库层唯一约束(非常关键)
不要只靠应用层判断,要在 DB 层兜底。
例如:
ALTER TABLE product
ADD COLUMN normalized_title TEXT;
CREATE UNIQUE INDEX uniq_product_normalized
ON product (normalized_title, brand_id, category_id);
这样可以保证:
即使代码有 bug,数据库也不会允许重复上架
2? 业务层改进(核心)
仅靠“标题”是远远不够的。
2.1 定义「商品唯一键」(Product Identity)
建议引入商品指纹(Product Fingerprint):
fingerprint = hash(
brand +
model +
spec +
category +
key_attributes
)
例如:
{
"brand": "Apple",
"model": "iPhone 15 Pro Max",
"storage": "256GB",
"color": "Black"
}
? 生成:
apple|iphone15promax|256gb|black
再 hash 成一个固定长度 ID。
? 好处:
描述文案怎么写都不影响唯一性
可以支持多语言
后续扩展(SKU / SPU)非常自然
2.2 区分 SPU / SKU(如果你还没做)
层级 含义
SPU 物理上同一商品(iPhone 15 Pro Max)
SKU 具体规格(256GB 黑色)
重复上架,90% 本质是 SPU 没抽象出来。
3? 智能去重(进阶,但很实用)
适合你这种已经有历史重复数据的系统。
3.1 文本相似度判重(辅助)
Levenshtein / Jaro-Winkler
TF-IDF + cosine
Sentence Embedding(更强)
策略示例:
相似度 > 0.92 → 强提示重复
相似度 0.85~0.92 → 人工确认
? 不建议直接“自动拒绝”,而是提示 + 合并建议
3.2 上架流程中的“防呆设计”
在商品发布页:
实时提示:
“系统检测到可能已存在相同商品”
展示候选商品卡片
提供选项:
作为新 SKU
合并到已有商品
确认新商品(需要理由)
四、历史数据治理(别忽略)
你现在一定已经有重复商品了。
建议:
离线跑一次聚类
输出:
候选合并列表
冲突字段
后台提供:
合并工具
主商品 / 从商品选择
自动重定向(SEO)
五、推荐的最终架构(总结)
[输入描述]
↓
[规范化]
↓
[结构化属性抽取]
↓
[商品指纹生成]
↓
[DB 唯一约束]
↓
[相似度检测 + UI 提示]
六、如果你愿意,我可以进一步帮你
你可以告诉我:
当前是否已有 SKU / SPU 区分
商品字段是 结构化还是纯文本
技术栈(Java / Go / Python / DB)
是否允许 后台人工干预合并
我可以直接帮你:
设计 商品唯一键 schema
给出 SQL + 代码示例
或直接设计一个 “防重复上架”模块接口
--
FROM 52.194.205.*