news 2026/3/15 0:46:52

Easy-Es实战:从零构建Elasticsearch商品搜索系统

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Easy-Es实战:从零构建Elasticsearch商品搜索系统

1. 为什么选择Easy-Es构建商品搜索系统

第一次接触Elasticsearch时,我被它复杂的DSL语法和繁琐的Java API劝退。直到发现Easy-Es这个神器,才真正体会到什么叫"用MySQL的方式操作ES"。作为国内Top1的ES ORM框架,Easy-Es能帮你省去80%的重复代码,特别适合需要快速搭建电商搜索系统的开发者。

这个框架最让我惊喜的是它的"全自动索引托管"功能。记得去年双十一前,我们商品类目结构调整导致字段变更,传统方案需要停机重建索引。而用Easy-Es只需要在实体类加个@IndexField注解,框架自动完成索引迁移,全程用户无感知。下面这张表对比了三种操作ES的方式:

操作类型原生API代码量Spring Data代码量Easy-Es代码量
简单条件查询15行8行3行
多条件权重排序30行+20行5行
聚合分析50行+40行10行

2. 5分钟快速集成Easy-Es

集成过程比想象中简单得多。首先在SpringBoot项目中加入依赖(注意版本匹配):

<dependency> <groupId>org.dromara.easy-es</groupId> <artifactId>easy-es-boot-starter</artifactId> <version>3.0.0</version> </dependency>

配置文件中只需三行关键配置:

easy-es: enable: true address: 127.0.0.1:9200 banner: false

创建商品实体类时,字段类型映射是重点。比如商品名称需要分词搜索,可以这样配置:

@IndexField(fieldType = FieldType.TEXT, analyzer = "ik_max_word") private String name;

而商品编号这类精确匹配的字段,应该用KEYWORD类型:

@IndexField(fieldType = FieldType.KEYWORD) private String productSn;

3. 实现商品CRUD的实战技巧

Mapper接口继承BaseEsMapper就自动获得了全套CRUD方法。这里分享几个实际开发中的经验:

  1. 批量插入优化:当导入10万+商品数据时,建议分批插入,每批500-1000条:
List<EsProduct> batchList = new ArrayList<>(1000); for(Product product : productList){ batchList.add(convert(product)); if(batchList.size() >= 1000){ esProductMapper.insertBatch(batchList); batchList.clear(); } }
  1. 智能字段更新:只更新非空字段,避免全量覆盖
// 只更新price字段 EsProduct updateObj = new EsProduct(); updateObj.setId(1L); updateObj.setPrice(new BigDecimal("99.9")); esProductMapper.updateById(updateObj);
  1. 条件删除的坑:删除接口返回的successCount是本次删除文档数,不是匹配的总数。如果需要精确控制,建议先查询再按ID删除。

4. 构建多维度商品搜索功能

电商搜索最核心的就是多条件组合查询。通过LambdaEsQueryWrapper可以优雅地实现:

LambdaEsQueryWrapper<EsProduct> wrapper = new LambdaEsQueryWrapper<>(); // 关键词搜索(不同字段权重不同) wrapper.and(w -> w.match(EsProduct::getName, keyword, 10f) .or().match(EsProduct::getSubTitle, keyword, 5f)); // 价格区间过滤 wrapper.between(EsProduct::getPrice, minPrice, maxPrice); // 聚合分析获取类目统计 wrapper.groupBy(EsProduct::getCategoryId);

实际项目中我推荐给高频查询添加别名,这样调整索引时不影响线上服务:

@IndexName(value = "product", alias = "product_search") public class EsProduct {...}

5. 高级搜索功能实现

相关商品推荐是个典型场景。通过nested嵌套类型实现属性关联查询:

@IndexField(fieldType = FieldType.NESTED, nestedClass = ProductAttribute.class) private List<ProductAttribute> attributes; // 查询相同属性的商品 wrapper.nestedMatch(EsProduct::getAttributes, attrWrapper -> attrWrapper.eq(ProductAttribute::getType, 1));

搜索词高亮显示也很简单:

wrapper.highLight(EsProduct::getName, new HighlightConfig().preTags("<em>").postTags("</em>"));

遇到特别复杂的聚合场景,可以无缝切换原生查询:

SearchRequest request = new SearchRequest("product"); // 构建原生DSL esProductMapper.search(request, RequestOptions.DEFAULT);

6. 性能优化实战经验

在千万级商品库的实践中,我总结了这些优化点:

  1. 索引设计:主分片数建议=节点数×1.5,副本数1-2个足够
@IndexName(value = "product", shardsNum = 6, replicasNum = 1)
  1. 查询优化:善用filter代替query,利用缓存机制
wrapper.filter(EsProduct::getStatus, 1); // 不过滤评分
  1. 慢查询监控:开启DSL日志分析耗时操作
easy-es: global-config: print-dsl: true
  1. 异步写入:对于日志类数据可以开启异步模式
async-process-index-blocking: false

7. 那些年踩过的坑

  1. 字段类型陷阱:字符串字段没声明为KEYWORD导致聚合异常
  2. 嵌套类型限制:nested查询性能较差,深度不要超过3层
  3. 版本兼容问题:ES7.x和8.x的API有差异,要核对清楚
  4. 分词器选择:中文建议用ik_smart+ik_max_word组合

最近发现EE的3.0版本新增了向量搜索支持,用@VectorField注解就能实现相似商品推荐,准备在新项目中试试效果。如果你也正在搭建搜索系统,不妨从官方demo开始,相信很快就能上手。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/13 10:43:54

HY-Motion 1.0工业培训:维修操作、安全演练等专业动作模板化生成

HY-Motion 1.0工业培训&#xff1a;维修操作、安全演练等专业动作模板化生成 在工厂车间里&#xff0c;老师傅带徒弟做设备检修&#xff0c;要反复演示“单膝跪地、左手扶稳阀体、右手逆时针匀速旋松螺母”这一连串动作&#xff1b;在变电站安全培训中&#xff0c;新员工需要准…

作者头像 李华
网站建设 2026/3/14 6:02:08

微信API二次开发中如何优化接口性能?

随着私域竞争进入深水区&#xff0c;企业正面临一场效率革命&#xff1a;运营团队深陷于添加好友、群维护、重复咨询等基础操作&#xff0c;人力被琐碎流程捆绑&#xff0c;战略思考与创意工作不断被挤压。这场“时间消耗战”正悄悄侵蚀企业的增长潜力。 为此&#xff0c;我们…

作者头像 李华
网站建设 2026/3/13 21:31:11

MedGemma-X运维实操手册:status_gradio.sh日志扫描与资源监控

MedGemma-X运维实操手册&#xff1a;status_gradio.sh日志扫描与资源监控 1. 为什么需要这份运维手册&#xff1f; 你刚部署好 MedGemma-X&#xff0c;界面打开了&#xff0c;模型加载成功&#xff0c;第一张胸片也顺利分析出了“双肺纹理增粗、右下肺野见斑片状模糊影”——…

作者头像 李华
网站建设 2026/3/14 6:53:35

Hunyuan-MT1.8B部署资源占用?accelerate配置详解

Hunyuan-MT1.8B部署资源占用&#xff1f;accelerate配置详解 1. 这不是“小模型”&#xff0c;但真能跑在单卡上——HY-MT1.5-1.8B的真实定位 很多人看到“1.8B”参数量&#xff0c;第一反应是&#xff1a;得A1004起步吧&#xff1f;显存至少80GB&#xff1f;其实不然。HY-MT…

作者头像 李华
网站建设 2026/3/13 15:56:17

opencode启动慢?冷启动加速与预加载优化方案

opencode启动慢&#xff1f;冷启动加速与预加载优化方案 1. 为什么opencode第一次启动总要等上好几秒&#xff1f; 你有没有遇到过这样的情况&#xff1a;终端里敲下opencode&#xff0c;光标就卡在那里不动&#xff0c;十几秒后才弹出TUI界面&#xff1f;或者刚切到“plan”…

作者头像 李华
网站建设 2026/3/13 6:21:51

解决CUDA内存问题:FLUX.1-dev的显存优化技术解析

解决CUDA内存问题&#xff1a;FLUX.1-dev的显存优化技术解析 在本地部署大模型图像生成服务时&#xff0c;你是否也经历过这样的瞬间——刚输入提示词&#xff0c;点击生成&#xff0c;屏幕却突然弹出刺眼的红色报错&#xff1a;CUDA out of memory&#xff1f;显存占用曲线一…

作者头像 李华