本文档详细介绍了mall电商系统中产品搜索功能。搜索模块利用Elasticsearch为客户提供快速、高效且功能丰富的搜索能力。有关Elasticsearch的配置和设置,请参阅Elasticsearch集成。
产品搜索实现旨在为客户提供强大且易于使用的产品查找方式。它支持各种搜索操作,包括:
下图说明了产品搜索实现所使用的架构
来源:mall-search/src/main/java/com/macro/mall/search/controller/EsProductController.java mall-search/src/main/java/com/macro/mall/search/service/EsProductService.java mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java mall-search/src/main/java/com/macro/mall/search/repository/EsProductRepository.java mall-search/src/main/java/com/macro/mall/search/dao/EsProductDao.java
搜索功能围绕以下关键数据模型构建:
EsProduct类代表Elasticsearch中的产品文档。它映射到MySQL数据库中的产品,并包含为搜索而优化的附加字段。
来源:mall-search/src/main/java/com/macro/mall/search/domain/EsProduct.java mall-search/src/main/java/com/macro/mall/search/domain/EsProductAttributeValue.java
EsProduct类中的要点
@Document(indexName = "pms")注解映射到Elasticsearch的“pms”索引。name、subTitle和keywords这样的文本字段使用ik_max_word分词器进行分析,以支持中文。attrValueList字段被标记为nested类型,以便能够对产品属性进行复杂查询。EsProductRelatedInfo类包含搜索结果的相关信息。
来源:mall-search/src/main/java/com/macro/mall/search/domain/EsProductRelatedInfo.java
在产品可以被搜索之前,它们必须被索引到Elasticsearch中。
以下序列图展示了产品如何从MySQL导入到Elasticsearch:
来源:mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java62-72 mall-search/src/main/java/com/macro/mall/search/controller/EsProductController.java31-37
EsProductDao.xml中的SQL查询连接了多个表以检索全面的产品信息
pms_product - 主要产品信息pms_product_attribute_value - 产品属性值pms_product_attribute - 属性定义来源:mall-search/src/main/resources/dao/EsProductDao.xml14-45
搜索功能在EsProductServiceImpl中实现,并通过EsProductController暴露。
基本搜索实现在search(String keyword, Integer pageNum, Integer pageSize)方法中
来源:mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java103-107 mall-search/src/main/java/com/macro/mall/search/repository/EsProductRepository.java13-21
此方法使用Spring Data Elasticsearch的方法命名约定,自动生成一个搜索name、subTitle和keywords字段的查询。
高级搜索实现在search(String keyword, Long brandId, Long productCategoryId, Integer pageNum, Integer pageSize, Integer sort)方法中
来源:mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java109-169
高级搜索的关键特性
筛选:产品可按品牌和类别进行筛选
相关性评分:使用函数评分查询,根据匹配位置提高相关性
name字段的权重为10subTitle字段的权重为5keywords字段的权重为2排序:结果可按以下方式排序
推荐功能建议与给定产品相似的产品。
来源:mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java172-215
推荐算法使用函数评分查询来查找符合以下条件的产品:
每种匹配类型被赋予不同的权重来计算相关性得分。
为了支持分面搜索,系统可以根据关键词检索相关信息(品牌、类别、属性)。
来源:mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java218-288
该方法使用Elasticsearch的聚合功能按以下内容进行分组:
搜索功能通过以下REST API端点暴露:
| 端点 | 方法 | 描述 |
|---|---|---|
/esProduct/importAll | POST | 将所有产品从MySQL导入Elasticsearch |
/esProduct/delete/{id} | GET | 从Elasticsearch中删除单个产品 |
/esProduct/delete/batch | POST | 从Elasticsearch中批量删除多个产品 |
/esProduct/create/{id} | POST | 在Elasticsearch中索引特定产品 |
/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.java
该系统包含集成测试,用于验证Elasticsearch集成。
testGetAllEsProductList():测试从MySQL检索产品testEsProductMapping():测试Elasticsearch映射的创建和检索来源:mall-search/src/test/java/com/macro/mall/search/MallSearchApplicationTests.java
产品搜索实现提供了全面的搜索解决方案,使客户能够快速准确地找到产品。它利用Elasticsearch强大的搜索功能,同时提供过滤、排序、推荐和分面搜索等附加功能。