菜单

Elasticsearch 集成

相关源文件

目的与范围

本文档描述了 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 设置

Elasticsearch 在 Docker 环境中配置如下

此配置

  • 使用的 Elasticsearch 版本为 7.17.3
  • 配置为单节点集群
  • 为 JVM 分配 512MB 的最小内存和 1GB 的最大内存
  • 将容器端口 9200 (HTTP) 和 9300 (transport) 映射到主机
  • 将数据和插件持久化到映射的卷中

来源: document/docker/docker-compose-env.yml41-53

索引配置

产品索引的配置如下

此配置定义了

  • 索引名称:pms (对应产品管理系统)
  • 分片数:1 (开发环境单分片)
  • 副本数:0 (开发环境无副本分片)

来源: mall-search/src/main/java/com/macro/mall/search/domain/EsProduct.java19-23

数据模型

产品文档结构

EsProduct 类定义了存储在 Elasticsearch 中的文档结构

关键字段映射包括

  • 带分析器的文本字段:namesubTitlekeywords (中文文本使用 IK 分词器)
  • Keyword 字段:productSnbrandNameproductCategoryName
  • 嵌套字段:attrValueList (用于产品属性)

来源: 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 查询

关键查询构建元素

  1. 过滤:使用 BoolQueryBuilder 结合 term 查询对 brandIdproductCategoryId 进行精确匹配
  2. 全文搜索:使用 FunctionScoreQueryBuilder 为不同字段设置权重
    • name:权重 10
    • subTitle:权重 5
    • keywords:权重 2
  3. 评分:使用 ScoreFunctionBuilders.weightFactorFunction() 来提升重要字段匹配的相关性
  4. 排序:使用 SortBuilders 按以下方式对结果进行排序
    • 相关性 (默认)
    • 新品 (id DESC)
    • 销量 (sale DESC)
    • 价格 (price ASC/DESC)

来源: mall-search/src/main/java/com/macro/mall/search/service/impl/EsProductServiceImpl.java109-170

产品推荐

系统可以根据产品 ID 推荐相关产品

实现方式如下:

  1. 从数据库检索源产品
  2. 基于产品的名称、品牌和类别进行搜索
  3. 构建加权查询,类似于高级搜索
  4. 排除结果中的原始产品

来源: 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

API 端点

搜索模块暴露以下 REST API 端点

端点方法描述
/esProduct/importAllPOST将所有产品从数据库导入到 ES
/esProduct/delete/{id}GET按 ID 从索引中删除产品
/esProduct/delete/batchPOST按 ID 批量删除产品
/esProduct/create/{id}POST按 ID 索引特定产品
/esProduct/search/simpleGET带分页的简单关键词搜索
/esProduct/searchGET带筛选和排序的高级搜索
/esProduct/recommend/{id}GET按 ID 获取产品推荐
/esProduct/search/relateGET获取相关搜索信息

来源: mall-search/src/main/java/com/macro/mall/search/controller/EsProductController.java26-108

与其他模块的集成

mall-search 模块通过 Docker 配置与其他组件集成

这使得搜索服务与以下组件连接

  • Elasticsearch (用于搜索功能)
  • MySQL (用于数据同步)

来源: document/docker/docker-compose-app.yml15-27

测试 Elasticsearch 集成

系统包含用于验证 Elasticsearch 集成的测试用例

这些测试验证了

  1. 从 MySQL 检索数据
  2. 索引映射的生成和验证

来源: mall-search/src/test/java/com/macro/mall/search/MallSearchApplicationTests.java15-36