菜单

产品搜索实现

相关源文件

本文档详细介绍了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

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”索引。
  • namesubTitlekeywords这样的文本字段使用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查询连接了多个表以检索全面的产品信息

  1. pms_product - 主要产品信息
  2. pms_product_attribute_value - 产品属性值
  3. 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的方法命名约定,自动生成一个搜索namesubTitlekeywords字段的查询。

高级搜索实现在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

高级搜索的关键特性

  1. 筛选:产品可按品牌和类别进行筛选

  2. 相关性评分:使用函数评分查询,根据匹配位置提高相关性

    • 匹配name字段的权重为10
    • 匹配subTitle字段的权重为5
    • 匹配keywords字段的权重为2
  3. 排序:结果可按以下方式排序

    • 相关性(默认)
    • 新品(按ID,最新优先)
    • 销量(销量最高优先)
    • 价格(升序或降序)

产品推荐

推荐功能建议与给定产品相似的产品。

来源: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的聚合功能按以下内容进行分组:

  • 品牌名称
  • 产品类别名称
  • 产品属性(仅类型1的属性)

API 端点

搜索功能通过以下REST API端点暴露:

端点方法描述
/esProduct/importAllPOST将所有产品从MySQL导入Elasticsearch
/esProduct/delete/{id}GET从Elasticsearch中删除单个产品
/esProduct/delete/batchPOST从Elasticsearch中批量删除多个产品
/esProduct/create/{id}POST在Elasticsearch中索引特定产品
/esProduct/search/simpleGET执行基本关键词搜索
/esProduct/searchGET执行带筛选和排序的高级搜索
/esProduct/recommend/{id}GET根据产品ID获取产品推荐
/esProduct/search/relateGET获取关键词的相关信息

来源: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强大的搜索功能,同时提供过滤、排序、推荐和分面搜索等附加功能。