17-黑马旅游案例-条件过滤
1.案例2:添加品牌、城市、星级、价格等过滤功能
步骤:
修改RequestParams类,添加brand、city、starName、minPrice、maxPrice等参数
修改search方法的实现,在关键字搜索时,如果brand等参数存在,对其做过滤
2.步骤:
步骤一:拓展IUserService的search方法的参数列表
修改RequestParams类,接收所有参数:
@Data
public class RequestParams {
private String key;
private Integer page;
private Integer size;
private String sortBy;
private String brand;
private String starName;
private String city;
private Integer minPrice;
private Integer maxPrice;
}
步骤二:修改search方法,在match查询基础上添加过滤条件
过滤条件包括:
city精确匹配
brand精确匹配
starName精确匹配
price范围过滤
注意事项:
多个条件之间是AND关系,组合多条件用BooleanQuery
参数存在才需要过滤,做好非空判断
Java代码:
业务层:
public PageResult search(RequestParams params) {
try {
// 1.准备Request
SearchRequest request = new SearchRequest("hotel");
// 2.准备DSL
// 2.1 query
buildBasicQuery(params, request);
// 2.2.分页
// 因为要参与运算,所以这里直接拆箱
int page = params.getPage();
int pageSize = params.getSize();
request.source().from((page - 1) + pageSize).size(pageSize);
// 4. 发送请求
// 这里的异常要try起来,不能抛,因为接口没抛,所以这儿也不能抛
SearchResponse response = client.search(request, RequestOptions.DEFAULT);
// 5.解析响应
return handleResponse(response);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 封装查询条件
private void buildBasicQuery(RequestParams params, SearchRequest request) {
// 构建BooleanQuery
BoolQueryBuilder 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);
}