淘东电商项目(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集群,并实现商品的查询。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值