1. 项目背景与核心挑战
最近在优化一个优惠券导购平台的商品搜索模块时,遇到了典型的电商搜索性能瓶颈。当用户输入"男士运动鞋 耐克 300-500元"这样的复合查询时,原有基于MySQL的方案响应时间经常超过2秒,在促销高峰期更是频繁超时。这直接影响了用户留存率——我们的埋点数据显示,搜索响应超过1.5秒时,用户跳出率会增加47%。
核心痛点在于:
- 多条件组合查询(品牌+品类+价格区间+优惠券可用性)
- 实时库存与价格变动
- 千万级SKU的模糊匹配
- 促销期间QPS峰值突破8000+
经过压力测试,我们发现单纯增加MySQL索引已经无法满足需求。一个商品表同时有brand_id、category_id、price、coupon_status等15个常用查询字段,如果全部建立联合索引,不仅索引文件会膨胀到原数据的1.8倍,写入性能也会下降60%。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 搜索引擎选型对比
我们对比了三种主流方案:
| 方案 | 写入延迟 | 查询性能 | 开发成本 | 运维复杂度 |
|---|---|---|---|---|
| MySQL+缓存 | <100ms | 1-3s | 低 | 低 |
| Elasticsearch | 1-2s | <200ms | 中 | 中 |
| ES+Canal实时同步 | <500ms | <100ms | 高 | 高 |
最终选择Elasticsearch+Canal的组合,主要基于:
- 查询性能需求:需要支持bool组合查询、范围查询、模糊匹配的混合操作
- 数据新鲜度:优惠券状态变更需要在30秒内生效
- 扩展性:ES分片机制可以水平扩展应对促销流量
2.2 最终架构实现
code复制MySQL -> Canal Server -> Kafka -> Logstash -> Elasticsearch
关键组件作用:
- **Canal
