一、创建changgou-service-api中创建changgou-service-search-api导入依赖,此部分写有关feign调用
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>changgou-service-api</artifactId>
<groupId>com.changgou</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>changgou-service-search-api</artifactId>
<dependencies>
<!--goods API依赖-->
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou-service-goods-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--SpringDataES依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
</project>
(2)搜索微服务搭建
在changgou-service中搭建changgou-service-search微服务,并进行相关配置。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>changgou-service</artifactId>
<groupId>com.changgou</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>changgou-service-search</artifactId>
<dependencies>
<!--依赖search api-->
<dependency>
<groupId>com.changgou</groupId>
<artifactId>changgou-service-search-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
yml文件配置
server:
port: 18086
spring:
application:
name: search
data:
elasticsearch:
cluster-name: my-application
cluster-nodes: 192.168.211.132:9300
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:7001/eureka
instance:
prefer-ip-address: true
feign:
hystrix:
enabled: true
#超时配置
ribbon:
ReadTimeout: 300000
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
启动类
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@EnableEurekaClient
public class SearchApplication {
public static void main(String[] args) {
/**
* Springboot整合Elasticsearch 在项目启动前设置一下的属性,防止报错
* 解决netty冲突后初始化client时还会抛出异常
* availableProcessors is already set to [12], rejecting [12]
***/
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(SearchApplication.class,args);
}
}
4.3.1 文档映射Bean创建
搜索商品的时候,会根据如下属性搜索数据,并且不是所有的属性都需要分词搜索,我们创建JavaBean,将JavaBean数据存入到ES中要以搜索条件和搜索展示结果为依据,部分关键搜索条件分析如下:
@Document(indexName = "skuinfo",type = "docs")
public class SkuInfo implements Serializable {
//商品id,同时也是商品编号
@Id
private Long id;
//SKU名称
@Field(type = FieldType.Text, analyzer = "ik_smart")
private String name;
//商品价格,单位为:元
@Field(type = FieldType.Double)
private Long price;
//库存数量
private Integer num;
//商品图片
private String image;
//商品状态,1-正常,2-下架,3-删除
private String status;
//创建时间
private Date createTime;
//更新时间
private Date updateTime;
//是否默认
private String isDefault;
//SPUID
private Long spuId;
//类目ID
private Long categoryId;
//类目名称
@Field(type = FieldType.Keyword)
private String categoryName;
//品牌名称
@Field(type = FieldType.Keyword)
private String brandName;
//规格
private String spec;
//规格参数
private Map<String,Object> specMap;
4.3.2 搜索审核通过Sku
修改changgou-service-goods微服务,添加搜索审核通过的Sku,供search微服务调用。下面都是针对goods微服务的操作。
修改SkuService接口,添加根据状态查询Sku方法,代码如下:
/**
List<Sku> findByStatus(String status);
修改SkuServiceImpl,添加根据状态查询Sku实现方法,代码如下:
/***
* 根据状态查询SKU列表
* @return
*/
@Override
public List<Sku> findByStatus(String status) {
Sku sku = new Sku();
sku.setStatus(status);
return skuMapper.select(sku);
}
修改com.changgou.goods.controller.SkuController,添加根据审核状态查询Sku方法,代码如下:
/***
* 根据审核状态查询Sku
* @param status
* @return
*/
@GetMapping("/status/{status}")
public Result<List<Sku>> findByStatus(@PathVariable String status){
List<Sku> list = skuService.findByStatus(status);
return new Result<List<Sku>>(true,StatusCode.OK,"查询成功",list);
}
4.3.3 Sku导入ES实现
(1) Feign配置
修改changgou-service-goods-api工程,在com.changgou.goods.feign.SkuFeign上添加findSkuList方法,代码如下:
@FeignClient(name="goods")
@RequestMapping(value = "/sku")
public interface SkuFeign {
/***
* 根据审核状态查询Sku
* @param status
* @return
*/
@GetMapping("/status/{status}")
Result<List<Sku>> findByStatus(@PathVariable String status);
}
(2) Dao创建
修改changgou-service-search工程,创建com.changgou.search.dao.SkuEsMapper,该接口主要用于索引数据操作,主要使用它来实现将数据导入到ES索引库中,代码如下:
@Repository
public interface SkuEsMapper extends ElasticsearchRepository<Sku,Long> {
}
(3) 服务层创建
修改changgou-service-search工程,创建com.changgou.search.service.SkuService,代码如下:
public interface SkuService {
/***
* 导入SKU数据
*/
void importSku();
}
修改changgou-service-search工程,创建com.changgou.search.service.impl.SkuServiceImpl,实现Sku数据导入到ES中,代码如下:
@Service
public class SkuServiceImpl implements SkuService {
@Autowired
private SkuFeign skuFeign;
@Autowired
private SkuEsMapper skuEsMapper;
/**
* 导入sku数据到es
*/
@Override
public void importSku(){
//调用changgou-service-goods微服务
Result<List<Sku>> skuListResult = skuFeign.findByStatus("1");
//将数据转成search.Sku
List<SkuInfo> skuInfos= JSON.parseArray(JSON.toJSONString(skuListResult.getData()),SkuInfo.class);
for(SkuInfo skuInfo:skuInfos){
Map<String, Object> specMap= JSON.parseObject(skuInfo.getSpec()) ;
skuInfo.setSpecMap(specMap);
}
skuEsMapper.saveAll(skuInfos);
}
}
(4)控制层配置
修改changgou-service-search工程,在com.changgou.search.controller.SkuController类中添加如下方法调用上述导入方法,代码如下:
@RestController
@RequestMapping(value = "/search")
@CrossOrigin
public class SkuController {
@Autowired
private SkuService skuService;
/**
* 导入数据
* @return
*/
@GetMapping("/import")
public Result search(){
skuService.importSku();
return new Result(true, StatusCode.OK,"导入数据到索引库中成功!");
}
}
(5)修改启动类
启动类中需要开启Feign客户端,并且需要添加ES包扫描,代码如下:
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
@EnableEurekaClient
@EnableFeignClients(basePackages = "com.changgou.goods.feign")
@EnableElasticsearchRepositories(basePackages = "com.changgou.search.dao")
public class SearchApplication {
public static void main(String[] args) {
/**
* Springboot整合Elasticsearch 在项目启动前设置一下的属性,防止报错
* 解决netty冲突后初始化client时还会抛出异常
* java.lang.IllegalStateException: availableProcessors is already set to [12], rejecting [12]
***/
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(SearchApplication.class,args);
}
}
(6)测试
调用http://localhost:18085/search/import
进行测试