淘东电商项目(46) -商品搜索服务功能的实现

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 淘东电商项目(46) -商品搜索服务功能的实现

引言

本文代码已提交至Github(版本号:0a915a211b9d4abc507c34151f75776ea47f721b),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop

前面的几篇博客讲解了在Docker下ELK的搭建,以及自动同步数据内容到ES的功能,阅读本文前,有兴趣的童鞋可以参阅下:

本文开始讲解商品服务搜索功能的实现。

本文目录结构:

l____引言

l____ 1. 商品服务搜索功能

l____ 2. 配置ES文档映射类型

l____ 3. 测试

l____ 4. 总结

1. 商品服务搜索功能

step1.定义DTO

@Data
public class ProductDto {
  /** 主键ID */
  private Integer id;
  /** 类型ID */
  private Integer categoryId;
  /** 名称 */
  private String name;
  /** 小标题 */
  private String subtitle;
  /** 主图像 */
  private String mainImage;
  /** 小标题图像 */
  private String subImages;
  /** 描述 */
  private String detail;
  /** 商品规格 */
  private String attributeList;
  /** 价格 */
  private Double price;
  /** 库存 */
  private Integer stock;
  /** 状态 */
  private Integer status;
  /** 乐观锁 */
  private Integer revision;
  /** 创建人 */
  private String createdBy;
  /** 创建时间 */
  private Date createdTime;
  /** 更新人 */
  private String updatedBy;
  /** 更新时间 */
  private Timestamp updatedTime;
}

step2.定义索引实体

@Document(indexName = "product", type = "product")
@Data
public class ProductEntity {
  /** 主键ID */
  private Integer id;
  /** 类型ID */
  private Integer categoryId;
  /** 名称 */
  private String name;
  /** 小标题 */
  private String subtitle;
  /** 主图像 */
  private String mainImage;
  /** 小标题图像 */
  private String subImages;
  /** 描述 */
  private String detail;
  /** 商品规格 */
  private String attributeList;
  /** 价格 */
  private Double price;
  /** 库存 */
  private Integer stock;
  /** 状态 */
  private Integer status;
  /** 创建人 */
  private String createdBy;
  /** 创建时间 */
  private Date createdTime;
  /** 更新时间 */
  private Timestamp updatedTime;
}

step3.定义ES索引仓库

public interface ProductRepository extends ElasticsearchRepository<ProductEntity, Long> {
}

step4.创建商品搜索服务接口

/**
 * description: 商品搜索接口
 * create by: YangLinWei
 * create time: 2020/4/3 2:23 下午
 */
public interface ProductSearchService {
    @GetMapping("/search")
    public BaseResponse<List<ProductDto>> search(String name);
}

step5.添加Maven依赖

<!-- springboot 整合ES -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-apt</artifactId>
</dependency>
<dependency>
  <groupId>com.querydsl</groupId>
  <artifactId>querydsl-jpa</artifactId>
</dependency>
<dependency>
  <groupId>ma.glasnost.orika</groupId>
  <artifactId>orika-core</artifactId>
  <version>1.5.2</version>
</dependency>

step6.实现类

@RestController
public class ProductSearchServiceImpl extends BaseApiService<List<ProductDto>> implements ProductSearchService {
    @Autowired
    private ProductRepository productRepository;
    @Override
    public BaseResponse<List<ProductDto>> search(String name) {
        // 1.拼接查询条件
        BoolQueryBuilder builder = QueryBuilders.boolQuery();
        // 2.模糊查询name字段
        builder.must(QueryBuilders.fuzzyQuery("name", name));
        Pageable pageable = new QPageRequest(0, 5);
        // 3.调用ES接口查询
        Page<ProductEntity> page = productRepository.search(builder, pageable);
        // 4.获取集合数据
        List<ProductEntity> content = page.getContent();
        // 5.将entity转换dto
        MapperFactory mapperFactory = new DefaultMapperFactory.Builder().build();
        List<ProductDto> mapAsList = mapperFactory.getMapperFacade().mapAsList(content, ProductDto.class);
        return setResultSuccess(mapAsList);
    }
}

step7.配置文件application.yml

###服务启动端口号
server:
  port: 8500
###服务名称(服务注册到eureka名称)
spring:
  application:
    name: taodong-shop-service-goods
  datasource:
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/taodong-goods?characterEncoding=utf8&useSSL=false
  redis:
    host: 127.0.0.1
    jedis:
      pool:
        max-active: 1000
        max-idle: 100
        max-wait: -1
        min-idle: 1
    port: 6379
  data:
    elasticsearch:
      cluster-name: elasticsearch-cluster
      cluster-nodes: 192.168.162.134:9301,192.168.162.134:9302
###服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8100/eureka
####swagger相关配置
swagger:
  base-package: com.ylw
  title: 淘东电商项目-商品服务接口
  description: 该项目“基于SpringCloud2.x构建微服务电商项目。
  version: 1.1
  terms-of-service-url: www.xxx.com
  contact:
    name: 杨林伟
    email: xxxxxx@qq.com

step8.启动类

@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = {"com.ylw.service.goods.es"})
public class AppProduct {
    public static void main(String[] args) {
        SpringApplication.run(AppProduct.class, args);
    }
}

2. 配置ES文档映射类型

配置商品ES文档映射类型,其主要的作用是查询时,指定analyzer使用ik分词器。

GET /product/_mapping
DELETE  /product
PUT /product
POST /product/_mapping/product
{
      "product": {
        "properties": {
          "@timestamp": {
            "type": "date"
          },
          "@version": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "attribute_list": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "category_id": {
            "type": "long"
          },
          "created_time": {
            "type": "date"
          },
          "detail": {
            "type": "text",
             "analyzer":"ik_smart",
            "search_analyzer":"ik_smart"
          },
          "id": {
            "type": "long"
          },
          "main_image": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "name": {
            "type": "text",
            "analyzer":"ik_smart",
            "search_analyzer":"ik_smart"
          },
          "revision": {
            "type": "long"
          },
          "status": {
            "type": "long"
          },
          "sub_images": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "subtitle": {
            "type": "text",
          "analyzer":"ik_smart",
         "search_analyzer":"ik_smart"
          },
          "updated_time": {
            "type": "date"
          }
        }
      }
}

3. 测试

启动Eureka,然后再在动商品服务,发现报错了:

这是由于spring-data-elasticsearch对应的es版本号不一致导致的,前面博客搭建的是ELK最新的版本为7.6.1,而spring-boot-starter-data-elasticsearch还没出支持这么高的版本:

所以要把ELK的环境重新安装,降版本号为:5.6.12,心中千万只草泥马在奔腾啊😡(2020.4.03)。


后续(2020.4.23)。。。。。

后来我把ELK的版本后降级为5.6.12了,发现有很多的坑,把Elasticsearch和Kibana安装好了,但是安装logstash的时候,出现了一堆的问题,为了不影响进度和学习,我没有使用docker来安装logstash了,直接在Linux下解压安装,配置过程大致相同的,此处就不再详述了。

docker启动es集群和kibana后,启动结果如下:

启动logstash,发现5.6.12直接运行./logstash,是不会自动去识别pipelines.yml的,只能一个配置文件一个配置文件去启动(后续会继续完善此问题):

./logstash -f /usr/local/logstash-5.6.12/config/mysql.conf 
./logstash -f /usr/local/logstash-5.6.12/config/mysql1.conf

浏览器访问:http://localhost:8500/search?name=%E6%9E%9C

可以看到能查询出内容。

4. 总结

本文主要讲解商品搜索的基本功能,通过使用SpringBoot来连接ES集群,并实现商品的查询。

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
目录
相关文章
|
SQL 小程序 JavaScript
【易售小程序项目】小程序首页(展示商品、商品搜索、商品分类搜索)【后端基于若依管理系统开发】
【易售小程序项目】小程序首页(展示商品、商品搜索、商品分类搜索)【后端基于若依管理系统开发】
57 0
|
8天前
|
存储 JSON API
淘宝API接口实战:高效获取商品标题、分类及店铺名称
在淘宝API接口实战中,通过以下步骤高效获取商品标题、分类及店铺名称:1. 准备工作:了解淘宝开放平台文档,注册开发者账号,选择开发语言和工具。2. 获取API访问权限:申请相应权限,提供应用场景说明。3. 调用API接口:构建HTTP请求,提供必要参数。4. 解析响应数据:提取JSON数据中的所需信息。5. 数据处理和存储:进一步处理并存储数据。6. 注意事项:遵守使用规范,注意调用频率和数据安全。示例代码使用Python调用淘宝API。
|
6月前
|
JSON 搜索推荐 数据挖掘
电商数据分析的利器:电商关键词搜索API接口(标题丨图片丨价格丨链接)
淘宝关键词搜索接口为电商领域的数据分析提供了丰富的数据源。通过有效利用这一接口,企业和研究人员可以更深入地洞察市场动态,优化营销策略,并提升用户体验。随着电商平台技术的不断进步,未来的API将更加智能和个性化,为电商行业带来更多的可能性。
|
6月前
|
数据采集 监控 供应链
shopee商品列表数据接口丨关键词搜索shopee商品数据采集
shopee商品列表数据接口丨关键词搜索shopee商品数据采集
|
6月前
|
API 开发工具 开发者
通过解析封装关键词搜索速卖通商品列表数据接口,速卖通API接口
通过解析封装关键词搜索速卖通商品列表数据接口,速卖通API接口
|
前端开发
47分布式电商项目 - 商品关键字搜索
47分布式电商项目 - 商品关键字搜索
39 0
47分布式电商项目 - 商品关键字搜索
|
JavaScript 前端开发
37分布式电商项目 - 网站首页(广告展示)
37分布式电商项目 - 网站首页(广告展示)
39 1
|
SQL 搜索推荐 数据库
淘东电商项目(39) -商品搜索服务数据库设计
淘东电商项目(39) -商品搜索服务数据库设计
103 0
|
自然语言处理 搜索推荐 关系型数据库
淘东电商项目(47) -商品搜索服务功能的实现(集成拼音分词器)
淘东电商项目(47) -商品搜索服务功能的实现(集成拼音分词器)
91 0
48分布式电商项目 - 搜索页与首页对接
48分布式电商项目 - 搜索页与首页对接
37 0