商品搜索系统核心是“数据能进、查询能快、结果能准”,需通过canal+kafka实现实时数据同步,合理设计es索引与分片,分层实现查询逻辑,并做好性能兜底与监控。

直接上手做,核心是“数据能进、查询能快、结果能准”。Java 项目里搭商品搜索系统,不是堆功能,而是理清数据流、选对工具、控住细节。
数据同步要稳,别让 ES 成数据孤岛
商品数据通常在 MySQL 里,ES 只是它的检索镜像。靠定时全量同步(比如 Logstash)容易丢变更、延迟高;推荐用 Canal + Kafka 构建实时链路:
- Canal 监听 MySQL binlog,捕获 insert/update/delete
- Kafka 做缓冲和解耦,避免下游处理慢拖垮数据库
- 独立 Java 消费服务负责组装宽表:把商品主信息、SKU、分类、品牌、库存状态、好评率等字段合并成一个 ES 文档
- 写入前做轻量清洗——比如过滤下架商品、标准化价格单位、补全空字段,避免脏数据污染索引
索引设计得合理,查得快还得好维护
别一上来就 mapping 塞满字段。重点考虑三件事:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 分片数别拍脑袋:单节点起步可用 3 主分片 + 1 副本;亿级商品建议 5~10 主分片,后续扩容靠 reindex,不能动态改
-
字段类型要对口:商品名、描述用
text并配 ik_smart 分词器;价格、销量、上架时间用keyword或long/date,禁用分词 -
冷热分离可预留:比如按月建索引(
products_202607),老数据归档到低配节点,查新商品走热节点
查询逻辑要分层,简单查用 Repository,复杂查用 DSL
Spring Data Elasticsearch 提供了极简路径,但别全依赖它:
- 基础操作(按 ID 查、按类目查、价格区间筛选)直接写 Repository 接口方法,比如
findByCategoryAndPriceBetween,自动转成 bool 查询 - 全文检索、模糊容错、拼音搜索、同义词扩展这些,得手写
ElasticsearchRestTemplate+ DSL - 排序别只用
_score:加function_score动态加权,比如销量 × 0.3 + 好评率 × 0.4 + 新品标识 × 0.3 - 高亮必须开:用
HighlightBuilder指定字段,前端渲染时加<em></em>标签即可
性能和稳定性得兜底,别等线上报警才补救
电商搜索最怕抖动和超时:
- ES 查询加
timeout(比如 300ms),超时就降级返回默认结果,别卡住整个接口 - 高频词(如“苹果”“手机”)加缓存,用 Caffeine 存 query DSL + 结果摘要,TTL 控制在 5~10 分钟
- 聚合统计(品牌列表、价格分布)提前算好存 Redis,别每次搜都触发 terms + histogram 聚合
- 监控必接:JVM 内存、ES 的 query latency、rejected executions、refresh time,异常时自动告警
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










