数据导入
1.请求search服务,调用数据导入地址
2.根据注册中心中的注册的goods服务的地址,使用Feign方式查询所有已经审核的Sku
3.使用SpringData Es将查询到的Sku集合导入到ES中
feign:调用远程服务
@FeignClient(name="goods")
@RequestMapping(value = "/sku")
public interface SkuFeign {
/***
* 根据审核状态查询Sku
* @param status
* @return
*/
@GetMapping("/status/{status}")
Result<List<Sku>> findByStatus(@PathVariable String status);
}
Dao:实现将数据导入到ES索引库中(可以不写@Repository)
@Repository
public interface SkuEsMapper extends ElasticsearchRepository<Sku,Long> {
}
Service:
@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);
}
}
controller:
@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,"导入数据到索引库中成功!");
}
}
启动类:
@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);
}
}
ES数据查询并分组
public Map search(Map<String, String> searchMap) {
//1.获取关键字的值
String keywords = searchMap.get("keywords");
if (StringUtils.isEmpty(keywords)) {
keywords = "华为";//赋值给一个默认的值
}
//2.创建查询对象 的构建对象
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
//3.设置查询的条件
//设置分组条件 商品分类
nativeSearchQueryBuilder.addAggregation(AggregationBuilders.terms("skuCategorygroup").field("categoryName").size(50));
nativeSearchQueryBuilder.withQuery(QueryBuilders.matchQuery("name", keywords));
//4.构建查询对象
NativeSearchQuery query = nativeSearchQueryBuilder.build();
//5.执行查询
AggregatedPage<SkuInfo> skuPage = esTemplate.queryForPage(query, SkuInfo.class);
//获取分组结果
StringTerms stringTermsCategory = (StringTerms) skuPage.getAggregation("skuCategorygroup");
List<String> categoryList =getStringsCategoryList(stringTermsCategory);
//6.返回结果
Map resultMap = new HashMap<>();
resultMap.put("categoryList", categoryList);
resultMap.put("rows", skuPage.getContent());
resultMap.put("total", skuPage.getTotalElements());
resultMap.put("totalPages", skuPage.getTotalPages());
return resultMap;
}
private List<String> getStringsCategoryList(StringTerms stringTerms) {
List<String> categoryList = new ArrayList<>();
if (stringTerms != null) {
for (StringTerms.Bucket bucket : stringTerms.getBuckets()) {
String keyAsString = bucket.getKeyAsString();//分组的值
categoryList.add(keyAsString);
}
}
return categoryList;
}