本文档描述了 Elasticsearch 在 mall 电子商务系统中集成以实现强大的产品搜索功能。内容涵盖了配置、数据建模、索引过程和搜索实现细节。有关产品搜索功能的最终用户视角,请参阅 产品搜索实现。
mall 系统集成了 Elasticsearch 作为其搜索引擎,以提供快速、相关的产品搜索功能。此集成支持关键词搜索、过滤、聚合和产品推荐等功能。
来源: mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java52-288 mall-search/src/main/java/com/macro/mall/search/controller/EsProductController.java19-109
Elasticsearch 在 Docker 环境中配置如下
此配置
来源: document/docker/docker-compose-env.yml41-53
产品索引的配置如下
此配置定义了
pms (对应产品管理系统)来源: mall-search/src/main/java/com/macro/mall/search/domain/EsProduct.java19-23
EsProduct 类定义了存储在 Elasticsearch 中的文档结构
关键字段映射包括
name、subTitle、keywords (中文文本使用 IK 分词器)productSn、brandName、productCategoryNameattrValueList (用于产品属性)来源: mall-search/src/main/java/com/macro/mall/search/domain/EsProduct.java19-51 mall-search/src/main/java/com/macro/mall/search/domain/EsProductAttributeValue.java14-28
系统通过以下流程将数据从 MySQL 同步到 Elasticsearch
也可以使用 create(Long id) 方法导入单个产品,该方法会获取特定产品并进行索引。
来源: mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java62-88 mall-search/src/main/java/com/macro/mall/search/controller/EsProductController.java31-65
系统支持简单搜索,该搜索将关键词与产品名称、副标题和关键词字段进行匹配
这是通过 Spring Data Elasticsearch 存储库方法实现的
来源: mall-search/src/main/java/com/macro/mall/search/service/EsProductService.java36-37 mall-search/src/main/java/com/macro/mall/search/repository/EsProductRepository.java13-21
对于更复杂的需求,系统使用了自定义实现,其中包含
这实现了
来源: mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java109-170
高级搜索使用以下方式构建 Elasticsearch 查询
关键查询构建元素
BoolQueryBuilder 结合 term 查询对 brandId 和 productCategoryId 进行精确匹配FunctionScoreQueryBuilder 为不同字段设置权重ScoreFunctionBuilders.weightFactorFunction() 来提升重要字段匹配的相关性SortBuilders 按以下方式对结果进行排序来源: mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java109-170
系统可以根据产品 ID 推荐相关产品
实现方式如下:
来源: mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java172-216
系统可以聚合搜索结果的品牌、类别、属性等相关信息
这利用了 Elasticsearch 的聚合功能
来源: mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java218-288 mall-search/src/main/java/com/macro/mall/search/domain/EsProductRelatedInfo.java8-26
搜索模块暴露以下 REST API 端点
| 端点 | 方法 | 描述 |
|---|---|---|
/esProduct/importAll | POST | 将所有产品从数据库导入到 ES |
/esProduct/delete/{id} | GET | 按 ID 从索引中删除产品 |
/esProduct/delete/batch | POST | 按 ID 批量删除产品 |
/esProduct/create/{id} | POST | 按 ID 索引特定产品 |
/esProduct/search/simple | GET | 带分页的简单关键词搜索 |
/esProduct/search | GET | 带筛选和排序的高级搜索 |
/esProduct/recommend/{id} | GET | 按 ID 获取产品推荐 |
/esProduct/search/relate | GET | 获取相关搜索信息 |
来源: mall-search/src/main/java/com/macro/mall/search/controller/EsProductController.java26-108
mall-search 模块通过 Docker 配置与其他组件集成
这使得搜索服务与以下组件连接
来源: document/docker/docker-compose-app.yml15-27
系统包含用于验证 Elasticsearch 集成的测试用例
这些测试验证了
来源: mall-search/src/test/java/com/macro/mall/search/MallSearchApplicationTests.java15-36