package com.youke.service;
import com.fasterxml.jackson.core.type.TypeReference;
import com.youke.clients.BrandClient;
import com.youke.clients.CategoryClient;
import com.youke.clients.GoodsClient;
import com.youke.clients.SpecificationClient;
import com.youke.enums.ExceptionEnum;
import com.youke.exceptions.YkException;
import com.youke.pojo.*;
import com.youke.repositorys.GoodsRepository;
import com.youke.utils.JsonUtils;
import com.youke.vo.SearchRequest;
import com.youke.vo.SearchResult;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.aggregations.Aggregation;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.Aggregations;
import org.elasticsearch.search.aggregations.bucket.MultiBucketsAggregation;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.*;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import javax.xml.crypto.Data;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class SearchService {
@Resource
private BrandClient brandClient;
@Resource
private CategoryClient categoryClient;
@Resource
private GoodsClient goodsClient;
@Resource
private SpecificationClient specificationClient;
@Resource
private ElasticsearchRestTemplate elasticsearchRestTemplate;
@Resource
private GoodsRepository goodsRepository;
/**
* 将数据库商品数据,转换为索引库数据
*
* @param spu
* @return
*/
public Goods buildGoods(Spu spu) {
//1.处理all,标题+分类+品牌
Brand brand = brandClient.queryBrandByid(spu.getBrandId());
List<Category> categories = categoryClient.queryCategoryByIds(Arrays.asList(spu.getCid1(), spu.getCid2(), spu.getCid3()));
String cnames = categories.stream().map(Category::getName).collect(Collectors.joining(" "));
String all=spu.getTitle()+" "+brand.getName()+" "+cnames;
//2.处理Sku
List<Map<String,Object>> skus=new ArrayList<>();
List<Sku> skuList = goodsClient.querySkus(spu.getId());
Set<Long> price = new HashSet<>();
skuList.forEach(sku ->{
//转换剔除不需要的属性
Map<String,Object> map = new HashMap<>();
map.put("id",sku.getId());
map.put("title",sku.getTitle());
map.put("price",sku.getPrice());
map.put("images", StringUtils.substringBefore(sku.getImages(),","));
skus.add(map);
//处理价格
price.add(sku.getPrice());
});
//转换成json
String skuStr= JsonUtils.toString(skus);
//3.处理Spec
Map<String,Object> specs=new HashMap<>();
//3.1拆线呢对应分类允许被搜索的数据
List<SpecParam> specParams = specificationClient.querySpecParamByList(null, spu.getCid3(), true);
//3.2查询商品详情获取通用规格参数和特有规格参数
SpuDetail spuDetail = goodsClient.querySpuDetail(spu.getId());
//3.3转换Json
Map<Long, String> genericSpecMap = JsonUtils.toMap(spuDetail.getGenericSpec(),Long.class,String.class);
Map<Long, List<String>> specialSpecMap = JsonUtils.nativeRead(spuDetail.getSpecialSpec(), new TypeReference<Map<Long, List<String>>>() {});
//3.4查找出该商品所有可搜索的通过和特有的规格参数(key=value)
specParams.forEach(param -> {
String key=param.getName();
Object value="";
//1.判断是否是通用规格参数
if (param.getGeneric()){
value=genericSpecMap.get(param.getId());
if (param.getNumeric()){
//处理成段
value=chooseSegment(value.toString(),param);
}
}else {
value=specialSpecMap.get(param.getId());
}
specs.put(key,value);
});
Goods goods = new Goods();
goods.setId(spu.getId());
goods.setAll(all);
goods.setSubTitle(spu.getSubTitle());
goods.setBrandId(spu.getBrandId());
goods.setCid1(spu.getCid1());
goods.setCid2(spu.getCid2());
goods.setCid3(spu.getCid3());
goods.setCreateTime(Date.from(spu.getCreateTime().atZone(ZoneId.systemDefault()).toInstant()));
goods.setPrice(price);
goods.setSkus(skuStr);
goods.setSpecs(specs);
return goods;
}
/**
* 处理分段操作
* @param value
* @param p
* @return
*/
private String chooseSegment(String value,SpecParam p){
double val = NumberUtils.toDouble(value);
String result = "其它";
//保存数值段
for (String segment : p.getSegments().split(",")){
String[] segs = segment.split("-");
//获取数值范围
double begin = NumberUtils.toDouble(segs[0]);
double end = Double.MAX_VALUE;
if (segs.length == 2){
end = NumberUtils.toDouble(segs[1]);
}
// 判断是否在范围内
if (val >= begin && val < end){
if (segs.length == 1){
result = segs[0] + p.getUnit() + "以上";
}else if (begin == 0){
result = segs[1] + p.getUnit() + "以下";
}else {
result = segment + p.getUnit();
}
break;
}
}
return result;
}
/**
* 页面搜索
* @param request
* @return
*/
public SearchResult querySearchPage(SearchRequest request) {
//0.不允许全部查询
String key = request.getKey();
if (StringUtils.isEmpty(key)){
throw new YkException(ExceptionEnum.SEARCH_GOODS_QUERY_ALL_ERROR);
}
//1.查询构造器
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
//过滤不需要的数据
queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{"id","subTitle","skus"},null));
//2.添加基本分词查询
QueryBuilder allMatchQuery = bulidBasicQuery(request);
queryBuilder.withQuery(allMatchQuery);
//3.处理分页
int page=request.getPage()-1;
int size=request.getSize();
queryBuilder.withPageable(PageRequest.of(page,size));
//4.排序
String sortBy=request.getSortBy();
Boolean desc=request.getDescending();
if (StringUtils.isNotBlank(sortBy)){
//如果不为空,则进行排序
queryBuilder.withSort(SortBuilders.fieldSort(sortBy).order(desc ? SortOrder.DESC : SortOrder.ASC));
}
//.聚合分类和品牌
String categoryAggName ="category_agg";
queryBuilder.addAggregation(AggregationBuilders.terms(categoryAggName).field("cid3"));
String brand_aggAggName ="brand_agg";
queryBuilder.addAggregation(AggregationBuilders.terms(brand_aggAggName).field("brandId"));
//.查询数据
SearchHits<Goods> searchHits = elasticsearchRestTemplate.search(queryBuilder.build(
没有合适的资源?快使用搜索试试~ 我知道了~
基于springcould所写的电商项目,使用了rabbitmq,es等等技术
共180个文件
java:144个
xml:19个
yml:11个
需积分: 0 0 下载量 146 浏览量
2023-11-10
23:30:15
上传
评论
收藏 229KB ZIP 举报
温馨提示
基于springcould所写的电商项目,使用了rabbitmq,es等等技术
资源推荐
资源详情
资源评论
收起资源包目录
基于springcould所写的电商项目,使用了rabbitmq,es等等技术 (180个子文件)
mvnw.cmd 7KB
.gitignore 395B
item.html 37KB
maven-wrapper.jar 59KB
SearchService.java 12KB
OrderServiceImpl.java 9KB
SpuServiceImpl.java 7KB
IdWorker.java 6KB
AlipayConfig.java 4KB
BrandServiceImpl.java 4KB
SmsUtils.java 4KB
CookieUtils.java 4KB
GoodsController.java 4KB
SpecificationController.java 3KB
RsaUtils.java 3KB
JwtUtils.java 3KB
UserServiceImpl.java 3KB
CartService.java 3KB
PageService.java 3KB
Order.java 3KB
AuthFilter.java 3KB
SpecGroupServiceImpl.java 3KB
ExceptionEnum.java 2KB
BrandController.java 2KB
UploadService.java 2KB
UserController.java 2KB
JsonUtils.java 2KB
AuthService.java 2KB
NumberUtils.java 2KB
SkuServiceImpl.java 2KB
JwtTest.java 2KB
TSearch.java 2KB
SpecParamServiceImpl.java 2KB
AuthController.java 2KB
OrderController.java 2KB
GoodsApi.java 2KB
Sku.java 2KB
UserInterceptor.java 2KB
ItemListener.java 2KB
Spu.java 2KB
GlobalCorsConfig.java 2KB
SpecParam.java 2KB
User.java 2KB
UserInterceptor.java 1KB
ItemListener.java 1KB
CartController.java 1KB
MvcConfig.java 1KB
CategoryController.java 1KB
AddressClient.java 1KB
OrderStatus.java 1KB
JwtProperties.java 1KB
IBrandMapper.java 1KB
Goods.java 1KB
SwaggerConfig.java 1KB
SmsListener.java 1KB
TestFdfs.java 1KB
SpecGroup.java 1KB
OrderDetail.java 1KB
CategoryServiceImpl.java 1KB
Category.java 1012B
CodeUtils.java 1003B
SpecificationApi.java 983B
ISpuService.java 979B
SpuDetail.java 919B
Stock.java 917B
UploadController.java 896B
PageController.java 895B
ISpecParamService.java 886B
Brand.java 866B
SearchRequest.java 866B
IBrandService.java 840B
ObjectUtils.java 837B
MvcConfig.java 825B
IUserService.java 789B
SearchController.java 767B
CommonExceptionHandler.java 755B
BrandApi.java 753B
SearchResult.java 751B
ISkuService.java 743B
ICategoryMapper.java 732B
Ttest.java 704B
JwtProperties.java 688B
ICategoryService.java 674B
MybatisPlusConfig.java 668B
JwtProperties.java 646B
ISpecGroupService.java 632B
JwtProperties.java 594B
IdWorkerConfig.java 576B
CategoryApi.java 562B
YkOrderService.java 561B
ExceptionResult.java 557B
IOrderService.java 533B
YkException.java 510B
StockServiceImpl.java 509B
SpuDetailServiceImpl.java 492B
YkSearchService.java 486B
YkAuthService.java 483B
YkPageService.java 482B
ykItemService.java 480B
YkUserService.java 480B
共 180 条
- 1
- 2
资源评论
Older司机渣渣威
- 粉丝: 6
- 资源: 202
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功