引言
本文代码已提交至Github(版本号:
0a915a211b9d4abc507c34151f75776ea47f721b
),有兴趣的同学可以下载来看看:https://github.com/ylw-github/taodong-shop
前面的几篇博客讲解了在Docker下ELK的搭建,以及自动同步数据内容到ES的功能,阅读本文前,有兴趣的童鞋可以参阅下:
- 《淘东电商项目(38) -Docker下安装ES&Kibana(一次填完所有的坑)》
- 《淘东电商项目(39) -商品搜索服务数据库设计》
- 《淘东电商项目(40) -Docker下安装Logstash(一次填完所有的坑)》
- 《淘东电商项目(41) -利用Logstash自动同步数据库内容到ES(超详细)》
- 《淘东电商项目(42) -利用Logstash自动同步数据库内容到ES(多文件方式)》
- 《淘东电商项目(43) -MQ与Logstash实现数据库同步到ES的区别》
- 《淘东电商项目(44) -Docker下搭建ElasticSearch集群》
- 《淘东电商项目(45) -Docker下Kibana与Logstash的ES集群配置(一次填完所有的坑)》
本文开始讲解商品服务搜索功能的实现。
本文目录结构:
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集群,并实现商品的查询。