Elasticsearch 实战:亿级商品量下高性能电商搜索系统架构与实现
·
Elasticsearch 实战:亿级商品量下高性能电商搜索系统架构与实现
|
🌺The Begin🌺点点关注,收藏不迷路🌺
|
一、前言
电商搜索是整个电商系统的流量入口,必须满足:高并发、低延迟(100ms内)、高可用、相关性精准、支持多维度筛选、排序、分页、高亮、推荐、自动补全等一系列复杂需求。
MySQL 根本扛不住,Elasticsearch 是电商搜索的工业级标准方案。
本文从架构设计、文档建模、索引优化、查询优化、同步方案、高并发、稳定性等方面,手把手教你搭建一套可支撑亿级商品、万级QPS的高性能电商搜索系统。
全文严格遵循 CSDN 博客格式:带流程图、有序号、标准标题、可直接发布、企业级实战。
二、电商搜索核心需求(必须满足)
- 全文检索:商品标题、描述、关键词搜索
- 精准筛选:分类、品牌、价格区间、规格、库存
- 多维度排序:综合、销量、价格、评分、新品
- 高亮展示:关键词标红
- 自动补全:输入提示
- 纠错推荐:拼音、错别字纠正
- 性能指标:99% 请求 < 100ms,QPS 万级
- 数据一致性:MySQL <-> ES 近实时同步
电商搜索整体架构流程图
三、第一步:文档建模(商品文档设计)
3.1 设计原则(电商核心)
- 反规范化:冗余所有需要搜索/筛选/排序的字段
- 扁平化:少嵌套、少 nested
- 字段类型精准:text / keyword / 数字 / date
- text + keyword 双字段是标配
3.2 标准商品文档模型(企业级)
{
"productId": {"type": "keyword"}, // 商品ID(精准)
"title": {"type": "text",
"analyzer": "ik_max_word",
"fields": {"keyword": {"type": "keyword"}}}, // 标题
"categoryId": {"type": "keyword"}, // 分类ID
"categoryName": {"type": "keyword"}, // 分类名
"brandId": {"type": "keyword"}, // 品牌ID
"brandName": {"type": "keyword"}, // 品牌名
"price": {"type": "double"}, // 价格
"sales": {"type": "integer"}, // 销量
"stock": {"type": "integer"}, // 库存
"createTime": {"type": "date"}, // 上架时间
"status": {"type": "keyword"}, // 上架状态
"tags": {"type": "keyword"}, // 标签:新品/热销
"specs": {"type": "keyword"}, // 规格:颜色/尺寸
"shopId": {"type": "keyword"} // 店铺ID
}
四、第二步:索引设计与高性能优化
4.1 索引设置(生产级)
{
"settings": {
"number_of_shards": 6, // 按数据量:1shard≈50GB
"number_of_replicas": 1, // 高可用
"refresh_interval": "1s", // 近实时
"index.sort.field": ["sales"], // 排序预排序
"index.mapping.total_fields.limit": 2000
}
}
4.2 索引优化关键点
- 合理分片:3~6 个为主
- 关闭不需要的字段
index: false不参与搜索doc_values: false不参与排序/聚合
- text 字段只开必要分词
- 禁止动态映射
dynamic: strict
五、第三步:MySQL <-> ES 数据同步(近实时)
5.1 企业级同步方案:Canal + Kafka + ES
无侵入、实时、高可用
同步流程图
5.2 同步保证
- 异步削峰
- 重试机制
- 幂等性
- 每日全量校验
六、第四步:高性能查询 DSL 设计(核心)
电商搜索必须使用 bool 组合查询,这是 ES 高性能的关键。
6.1 标准电商搜索 DSL
GET /product/_search
{
"size": 20,
"from": 0,
"_source": ["productId","title","price","brandName"],
"sort": [{"sales": "desc"}],
"query": {
"bool": {
"must": [
{"match": {"title": "手机"}} // 全文检索
],
"filter": [
{"term": {"status": "1"}}, // 上架状态
{"term": {"brandName": "华为"}},// 品牌筛选
{"range": {"price": {"gte": 1000, "lte": 5000}}} // 价格区间
]
}
},
"highlight": {
"fields": {"title": {}}
}
}
6.2 性能关键点
- filter 代替 query:过滤不打分,性能极高
- must 只放全文检索
- term 筛选 keyword
- range 筛选数字/日期
- _source 只返回需要字段
七、第五步:必做的八大性能优化
7.1 使用 filter 缓存(极快)
- filter 结果自动缓存
- 品牌、分类、状态、价格都用 filter
7.2 禁用打分提高速度
不需要相关性的场景,使用 constant_score
7.3 前缀匹配/自动补全
使用 completion 类型(FST 字典树)
7.4 聚合查询深度优化
- 使用
global、filter聚合 - 避免深度聚合
7.5 深度分页问题
- 小分页:from + size
- 大分页:search_after + 游标
7.6 批量查询
使用 mget / bulk
7.7 关闭不必要的功能
- 关闭
_all - 关闭
_field_names
7.8 集群硬件优化
- SSD 硬盘(必须)
- 堆内存 31GB
- 数据节点 CPU 16核+
八、第六步:高可用与稳定性保障
8.1 集群架构
- 3 个主节点
- 6~12 个数据节点
- 1~2 个协调节点
8.2 熔断限流
- ES 自带断路器
- API 层限流
8.3 监控告警
- CPU、堆内存、磁盘、QPS、响应时间
- 分片异常、节点掉线
九、第七步:用户体验增强功能
9.1 搜索自动补全
"suggest": {
"product-suggest": {
"prefix": "hua",
"completion": {"field": "title_suggest"}
}
}
9.2 搜索高亮
"highlight": {
"pre_tags": ["<font color='red'>"],
"post_tags": ["</font>"],
"fields": {"title": {}}
}
9.3 拼音搜索
安装 pinyin 分词插件
9.4 错别字纠错
使用 phrase suggester
十、企业级最终性能指标(可达到)
- 响应时间:99% < 50ms
- QPS:1万+
- 数据量:亿级商品
- 同步延迟:1~3秒
- 可用性:99.9%
十一、总结(电商搜索核心口诀)
- 文档反规范化、扁平化
- text+keyword 双字段设计
- filter 做筛选,must 做检索
- Canal+MQ 实现近实时同步
- SSD + 合理分片 + 堆外内存
- 只查需要字段,禁用不必要功能
- 高可用集群 + 熔断限流 + 监控
遵循这套方案,你可以快速搭建工业级、高性能、稳定可靠的电商搜索系统。

|
🌺The End🌺点点关注,收藏不迷路🌺
|
更多推荐





所有评论(0)