17-黑马旅游案例-条件过滤

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);
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值