【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
**案例2:**添加品牌、城市、星级、价格等过滤功能
需求效果如图:
步骤:
修改RequestParams类,添加brand、city、starName、minPrice、maxPrice等参数
修改search方法的实现,在关键字搜索时,如果brand等参数存在,对其做过滤
看看请求


因为笔者数据库里面压根儿就没有杭州,我就把这个数据改掉了


OK
把条件都选上

这就是一会儿要接收的请求参数 作为过滤条件
步骤一:拓展IUserService的search方法的参数列表
【修改请求参数实体类】
修改RequestParams类,接收所有参数:

package cn.itcast.hotel.pojo;import lombok.Data;/*** ClassName: RequestParams* date: 2022/11/2 11:03** @author DingJiaxiong*/@Data
public class RequestParams {private String key;private Integer page;private Integer size;private String sortBy;private String city;private String brand;private String starName;private Integer minPrice;private Integer maxPrice;}
OK
步骤二:修改search方法,在match查询基础上添加过滤条件
过滤条件包括:
注意事项:
直接做
现在的业务层代码【实现类】
package cn.itcast.hotel.service.impl;import cn.itcast.hotel.mapper.HotelMapper;
import cn.itcast.hotel.pojo.Hotel;
import cn.itcast.hotel.pojo.HotelDoc;
import cn.itcast.hotel.pojo.PageResult;
import cn.itcast.hotel.pojo.RequestParams;
import cn.itcast.hotel.service.IHotelService;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;import javax.crypto.spec.OAEPParameterSpec;
import javax.crypto.spec.PBEParameterSpec;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;@Service
public class HotelService extends ServiceImpl implements IHotelService {@Autowiredprivate RestHighLevelClient client;@Overridepublic PageResult search(RequestParams params) {try {//1. 准备RequestSearchRequest request = new SearchRequest("hotel");//2. 准备DSL//2.1 关键字搜索querybuildBasicQuery(params, request);//2.2 分页Integer page = params.getPage();Integer size = params.getSize();request.source().from((page - 1) * size).size(size);//3. 发送请求SearchResponse response = client.search(request, RequestOptions.DEFAULT);//4. 解析响应return handleResponse(response);}catch (IOException e){throw new RuntimeException(e);}}private static void buildBasicQuery(RequestParams params, SearchRequest request) {//构建BooleanQueryBoolQueryBuilder boolQuery = QueryBuilders.boolQuery();//关键字搜索String key = params.getKey();//健壮判断if (key == null || "".equals(key)) {boolQuery.must(QueryBuilders.matchAllQuery());} else {boolQuery.must(QueryBuilders.matchQuery("all", key));}//条件过滤//【城市】if (params.getCity() != null && !params.getCity().equals("")){boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));}//【品牌】if (params.getBrand() != null && !params.getBrand().equals("")){boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));}//【星级】if (params.getStarName() != null && !params.getStarName().equals("")){boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));}//【价格】if (params.getMinPrice() != null && params.getMaxPrice() != null){boolQuery.filter(QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice()));}request.source().query(boolQuery);}private PageResult handleResponse(SearchResponse response) {//4. 解析响应SearchHits searchHits = response.getHits();//4.1 获取总条数long total = searchHits.getTotalHits().value;System.out.println("共搜索到" + total + "条数据");//4.2 文档数组SearchHit[] hits = searchHits.getHits();//4.3 遍历List hotels = new ArrayList<>();for (SearchHit hit : hits) {//获取文档sourceString json = hit.getSourceAsString();//反序列化HotelDoc hotelDoc = JSON.parseObject(json, HotelDoc.class);hotels.add(hotelDoc);}//4.4 封装返回return new PageResult(total, hotels);}
}

OK,没啥问题
看看请求

响应结果

没问题
【这样就实现了条件过滤查询】