JAVA全系列 教程
3762个小节阅读:7088.2k
目录
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
搜索功能的编写比较复杂,首先搜索条件繁多,有关键字、价格、品牌、规格等。其次返回的结果除了搜索到的商品,还要返回搜索面板,包含关键字对应的品牌、品类、规格等,还要将搜索条件回显回去,供前端操作。接下来我们编写商品的搜索功能。
重写搜索产品功能
xxxxxxxxxx
// 搜索产品
@Override
public GoodsSearchResult search(GoodsSearchParam goodsSearchParam) {
// 1.构造ES搜索条件
// 2.搜索
// 3.将查询结果封装为Page对象
// 4.封装结果对象
// 4.1 查询结果
// 4.2 查询查询参数
// 4.3 查询面板
return null;
}
编写构造ES搜索条件功能
xxxxxxxxxx
/**
* 构造搜索条件
* @param goodsSearchParam 查询条件对象
* @return 搜索条件对象
*/
public NativeSearchQuery buildQuery(GoodsSearchParam goodsSearchParam){
// 1.创建复杂查询条件对象
BoolQueryBuilder builder = QueryBuilders.boolQuery();
// 2.如果查询条件有关键词,关键词可以匹配商品名、副标题、品牌字段;否则查询所有商品
if (!StringUtils.hasText(goodsSearchParam.getKeyword())){
MatchAllQueryBuilder matchAllQueryBuilder = QueryBuilders.matchAllQuery();
builder.must(matchAllQueryBuilder);
}else {
String keyword = goodsSearchParam.getKeyword();
MultiMatchQueryBuilder multiMatchQueryBuilder = QueryBuilders.multiMatchQuery(keyword, "goodsName", "caption", "brand");
builder.must(multiMatchQueryBuilder);
}
// 3.如果查询条件有品牌,则精准匹配品牌
String brand = goodsSearchParam.getBrand();
if (StringUtils.hasText(brand)){
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("brand", brand);
builder.must(termQueryBuilder);
}
// 4.如果查询条件有价格,则匹配价格
Double highPrice = goodsSearchParam.getHighPrice();
Double lowPrice = goodsSearchParam.getLowPrice();
if (highPrice != null && highPrice != 0){
RangeQueryBuilder lte = QueryBuilders.rangeQuery("price").lte(highPrice);
builder.must(lte);
}
if (lowPrice != null && lowPrice != 0){
RangeQueryBuilder gte = QueryBuilders.rangeQuery("price").gte(lowPrice);
builder.must(gte);
}
// 5.如果查询条件有规格项,则精准匹配规格项
Map<String, String> specificationOptions = goodsSearchParam.getSpecificationOption();
if (specificationOptions != null && specificationOptions.size() > 0){
Set<Map.Entry<String, String>> entries = specificationOptions.entrySet();
for (Map.Entry<String, String> entry : entries) {
String key = entry.getKey();
String value = entry.getValue();
if (StringUtils.hasText(key)){
TermQueryBuilder termQuery = QueryBuilders.termQuery("specification." + key + ".keyword", value);
builder.must(termQuery);
}
}
}
// 6.添加分页条件
PageRequest pageable = PageRequest.of(goodsSearchParam.getPage() - 1, goodsSearchParam.getSize());
// 查询构造器,添加条件和分页
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
nativeSearchQueryBuilder.withQuery(builder).withPageable(pageable);
// 7.如果查询条件有排序,则添加排序条件
String sortFiled = goodsSearchParam.getSortFiled();
String sort = goodsSearchParam.getSort();
SortBuilder sortBuilder = null;
if (StringUtils.hasText(sort) && StringUtils.hasText(sortFiled)){
// 新品的正序是id的倒序
if (sortFiled.equals("NEW")){
sortBuilder = SortBuilders.fieldSort("id");
if (sort.equals("ASC")){
sortBuilder.order(SortOrder.DESC);
}
if (sort.equals("DESC")){
sortBuilder.order(SortOrder.ASC);
}
}
if (sortFiled.equals("PRICE")){
sortBuilder = SortBuilders.fieldSort("price");
if (sort.equals("ASC")){
sortBuilder.order(SortOrder.ASC);
}
if (sort.equals("DESC")){
sortBuilder.order(SortOrder.DESC);
}
}
nativeSearchQueryBuilder.withSorts(sortBuilder);
}
// 8.返回查询条件对象
NativeSearchQuery query = nativeSearchQueryBuilder.build();
return query;
}