Milvus 向量检索服务 + SpringBoot 实战:电商商品语义检索与相似商品推荐
一、业务背景与需求
1. 原有痛点
传统电商依靠MySQL + Elasticsearch 关键词检索,存在明显短板:
- 仅能匹配字面关键词,无法理解语义。例如用户搜「夏天穿的薄款跑鞋」,关键词不全则召回结果差;
- 相似商品推荐依赖规则/标签,人工维护成本高,推荐同质化严重;
- 商品文案、属性、卖点无法统一做相似度计算。
2. 业务范围 & 数据规模
- 业务:综合电商平台,主营服饰、鞋靴、日用品
- 存量商品:280万条,日新增商品 3000+
- 接口指标:检索接口 QPS 3000+,P99 响应耗时要求 ≤ 30ms
- 核心功能:
- 语义搜索:用户自然语言搜索商品
- 相似商品推荐:商品详情页「猜你喜欢」
- 低质重复商品排查:利用向量相似度做商品去重
3. 技术选型最终方案
- 向量引擎:阿里云向量检索服务(Milvus 托管版)(免运维、兼容原生Milvus、内网低延迟)
- 开发框架:SpringBoot 2.7.x + Java 8(线上主流版本)
- 向量化模型:阿里云通义千问text-embedding-v1(输出1536维浮点向量)
- 存储分层:MySQL(原始商品数据)+ Milvus(商品向量+基础属性)
- 索引策略:HNSW(高并发检索场景首选)+ 余弦相似度(语义匹配标准算法)
二、核心问题解答:哪些数据需要做向量化?
这是向量项目落地最关键环节,也是区分Demo和真实项目的核心。
1. 参与向量化的数据源(电商标准组合)
不单独对某一个字段向量化,行业通用做法:多字段拼接为一段完整描述文本,再统一生成向量,保证语义完整性。
选取商品核心业务字段:
字段名 | 说明 | 是否参与拼接 |
商品ID | 主键,唯一标识 | 不参与向量化,Milvus主键字段 |
商品名称 | 核心名称 | ✅ 必选 |
商品分类 | 一级/二级分类(如:鞋靴>运动鞋) | ✅ 必选 |
商品规格 | 尺码、版型、材质(如:网面、透气、低帮) | ✅ 必选 |
商品卖点/短描述 | 营销文案、功能特点 | ✅ 必选 |
品牌名称 | 品牌信息 | ✅ 必选 |
价格、库存、上下架状态 | 业务状态字段 | ❌ 不向量化,作为Milvus标量字段过滤 |
2. 文本拼接规则(工程化标准格式)
固定拼接模板,保证格式统一,避免向量语义混乱:
Plaintext |
示例:
原始字段:
- 品牌:耐克
- 名称:男子网面运动跑鞋
- 分类:鞋靴 > 休闲运动鞋
- 规格:网面透气、轻便、低帮
- 卖点:夏季新款、防滑减震
拼接后待向量化文本:
Plaintext |
核心逻辑:把结构化商品数据转为自然语言文本,再交给Embedding模型生成向量,语义才能和用户搜索语句对齐。
3. 数据流转全链路(完整真实流程)
- 商品新增/编辑:运营后台录入数据 → 数据存入MySQL主库;
- 消息解耦:MySQL binlog / 业务MQ 触发向量构建任务(异步,不阻塞主流程);
- 文本组装:读取商品多字段,按规则拼接成完整描述文本;
- 生成向量:调用Embedding接口,文本 → 1536维浮点向量;
- 写入向量库:商品ID(主键)、基础属性(分类/品牌)、向量 一并存入Milvus;
- 在线检索:
- 用户输入搜索词 → 搜索词转向量;
- Milvus 执行向量相似度检索 + 标量过滤(过滤下架商品);
- 返回相似商品ID → 回查MySQL补全商品详情 → 前端渲染。
三、环境与依赖配置
1. 阿里云 Milvus 实例信息
- 实例类型:阿里云托管 Milvus 2.4
- 内网连接地址:c-xxxxxxxx.milvus.aliyuncs.com:19530
- 账号密码:实例创建后分配
- 向量维度:1536
- 集合名称:product_vector_collection
2. Maven 依赖(线上稳定版本)
XML |
3. 配置文件application.yml
YAML |
四、代码实现(工程化分层,贴合线上项目)
分层说明
- 配置类:Milvus 客户端全局单例(生产禁止频繁创建客户端)
- 工具类:文本拼接、Embedding 向量生成(独立抽离,复用)
- 实体类:Milvus 存储实体、业务入参/出参
- 服务层:集合管理、向量新增、向量检索、数据过滤
- 控制器:对外HTTP接口(供前端/网关调用)
1. Milvus 客户端配置类
Java |
2. 核心工具类:文本拼接 + 向量生成
重点:还原真实的字段拼接、向量化逻辑
Java |
3. 实体类:商品向量实体(对应Milvus集合字段)
Java |
4. 业务服务层(核心逻辑)
包含:创建集合、创建索引、新增商品向量、语义检索
Java |
5. 接口控制器
Java |
五、真实业务调用演示 & 数据流向验证
1. 场景1:商品录入,生成向量并入库
请求示例(新增一条跑鞋商品)
HTTP |
执行流程:
- 工具类拼接文本:耐克 鞋靴>休闲运动鞋
- 调用通义Embedding,生成1536维向量
- 商品ID、品牌、分类、状态、向量 全部写入Milvus
2. 场景2:用户语义搜索
请求
HTTP |
执行流程:
- 搜索关键词夏季透气运动跑鞋转为向量;
- Milvus 执行余弦相似度检索,同时过滤status=1(仅上架商品);
- 返回Top5相似商品ID[10001,10005,10009...];
- 业务层根据ID查询MySQL,拼接商品详情返回前端。
六、线上生产规范 & 踩坑总结(真实运维经验)
1. 数据向量化规范
- 禁止单字段向量化:单一字段语义残缺,检索效果极差;
- 统一拼接格式:全项目使用同一套拼接模板,否则向量空间不匹配;
- 空值过滤:字段为空时不要拼接无效字符,干扰语义。
2. 架构优化(线上必做)
- 向量构建异步化:商品新增/编辑走MQ异步生成向量,不要同步阻塞主业务;
- 批量导入:历史存量280万商品,使用Milvus批量插入接口,单批次500条;
- 冷热分离:长期滞销商品可迁移至低成本索引,降低内存开销。
3. Milvus 使用避坑
- 生产环境必须使用阿里云内网地址,公网仅用于测试;
- 向量维度一旦确定,集合无法修改维度,改维度只能重建集合;
- HNSW索引适合高并发检索,数据量超千万不建议用FLAT全量检索;
- 标量过滤提前规划(上下架、分类、价格区间),减少无效向量召回。
4. 性能指标(线上真实数据)
- 数据总量:280万商品向量(1536维)
- 平均检索耗时:12~20ms
- P99耗时:28ms
- 峰值QPS:3200
- 对比传统ES:语义搜索召回率提升 38%,相似推荐点击率提升 22%
七、拓展延伸
- 商品去重:利用向量相似度,设置阈值(余弦分>0.85)判定为重复商品;
- 多级过滤:向量召回后,再叠加价格、地区、优惠券等业务规则二次筛选;
- 缓存搭配:热点检索结果搭配Caffeine本地缓存,进一步降低Milvus压力。
八、总结
本案例完全还原电商行业向量检索落地标准流程:
- 明确了结构化字段 → 文本拼接 → 向量化的完整数据链路;
- 结合业务状态做标量过滤,贴合线上真实业务;
- 采用异步、批量、内网部署等工程化方案,可直接上生产;
- 附带真实性能指标、运维规范与踩坑经验。
Milvus搭配SpringBoot可以快速落地语义检索、相似推荐等AI场景,是传统业务AI化的优选方案。
