引言
本文代码已提交至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集群配置(一次填完所有的坑)》
本文开始讲解商品服务搜索功能的实现。
本文目录结构:
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集群,并实现商品的查询。