1. 项目背景与核心价值
最近在折腾一个电商平台的搜索推荐模块时,发现传统的关键词匹配方式越来越力不从心。用户搜索"夏季轻薄外套",系统却只能机械地匹配标题中含这些关键词的商品,完全不懂"透气防晒衣"、"空调衫"这些同义商品也该被推荐。这种场景下,向量计算技术就成了破局的关键。
华为云数据仓库服务DWS(Data Warehouse Service)最近推出的向量计算功能,让我们能够用SQL直接处理向量数据。这个功能基于PostgreSQL的pgvector扩展,支持欧式距离、余弦相似度等计算方式。对于中小型电商来说,用DWS实现向量搜索是个性价比很高的方案——既不用搭建专门的向量数据库,又能复用现有的数据仓库基础设施。
2. 系统架构设计
2.1 整体技术栈选择
整个系统采用三层架构:
- 数据层:DWS作为向量存储和计算引擎
- 服务层:Spring Boot微服务封装向量搜索接口
- 展示层:Vue.js实现前端交互界面
选择DWS而不是专用向量数据库(如Milvus)主要考虑:
- 已有商品数据都存储在DWS中,避免跨系统ETL
- 团队熟悉SQL开发,学习成本低
- 华为云DWS的分布式架构能支撑亿级向量数据
2.2 向量生成方案
商品向量通过两种方式生成:
- 标题和描述文本使用BERT模型提取768维向量
- 商品类目、品牌等结构化数据通过One-Hot编码
实测发现,将文本向量和结构化向量拼接后降维到256维效果最佳。降维采用PCA算法,既保持区分度又减少存储空间。
3. DWS向量功能实操
3.1 环境准备
首先在DWS中创建扩展:
CREATE EXTENSION vector;建表时定义向量字段:
CREATE TABLE products ( id BIGINT PRIMARY KEY, name VARCHAR(255), vector VECTOR(256) -- 256维向量 );3.2 向量索引优化
为加速搜索,需要创建IVFFLAT索引:
CREATE INDEX products_vector_idx ON products USING ivfflat (vector) WITH (lists = 100); -- 根据数据量调整lists参数这里lists参数控制聚类中心数量,经验公式:
- 数据量<100万:lists=数据量/1000
- 数据量>100万:lists=sqrt(数据量)
3.3 相似度搜索SQL
核心搜索语句示例:
SELECT id, name, 1 - (vector <=> '[0.1,0.2,...]') AS similarity FROM products ORDER BY vector <=> '[0.1,0.2,...]' LIMIT 10;其中<=>是余弦距离运算符,DWS还支持:
<->欧式距离<#>内积距离
4. 工程化实践要点
4.1 性能优化技巧
- 批量写入时先禁用索引:
ALTER INDEX products_vector_idx UNUSABLE; -- 批量INSERT... ALTER INDEX products_vector_idx REBUILD;查询时使用预编译语句避免硬解析
设置work_mem参数提升排序性能:
SET work_mem='256MB';4.2 混合搜索策略
实际采用"向量搜索+业务过滤"的混合模式:
WITH vector_results AS ( SELECT id FROM products WHERE vector <=> '[0.1,0.2,...]' < 0.3 ORDER BY vector <=> '[0.1,0.2,...]' LIMIT 100 ) SELECT p.* FROM products p JOIN vector_results v ON p.id = v.id WHERE p.category = 'clothing' -- 业务过滤条件 AND p.price BETWEEN 100 AND 500 LIMIT 10;5. 效果评估与调优
5.1 评估指标
建立A/B测试框架对比:
- 传统关键词搜索(对照组)
- 向量搜索(实验组)
核心指标:
- CTR(点击通过率)
- 转化率
- 平均停留时长
5.2 参数调优
通过网格搜索确定最佳参数组合:
- 向量维度:128/256/512
- 相似度阈值:0.2/0.3/0.4
- 返回结果数:5/10/20
最终我们选择256维+0.3阈值+10条结果的组合,CTR提升37%。
6. 踩坑实录
索引重建导致服务超时
- 解决:在低峰期执行rebuild,或采用CONCURRENTLY方式
向量维度不一致报错
- 注意:所有向量必须严格等长,写入前要校验维度
距离计算方式选错
- 关键:文本相似度用余弦距离,图搜用欧式距离
内存不足问题
- 方案:调整maintenance_work_mem参数
SET maintenance_work_mem='2GB';
这个方案上线后,最让我意外的是连带效果——用户"找不到想要商品"的客服投诉减少了65%。不过要提醒的是,DWS的向量功能目前最大支持2048维,超大规模场景还是需要考虑专业向量数据库。