酒店结果过滤

目录

需求分析

修改实体类

修改搜索业务


需求分析

在页面搜索框下面,会有一些过滤项:

传递的参数如图:

包含的过滤条件有:

  • brand:品牌值
  • city:城市
  • minPrice~maxPrice:价格范围
  • starName:星级

我们需要做两件事情:

  • 修改请求参数的对象RequestParams,接收上述参数
  • 修改业务逻辑,在搜索条件之外,添加一些过滤条件

修改实体类

修改在cn.test.hotel.pojo包下的实体类RequestParams:

java 复制代码
@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;
}

修改搜索业务

HotelServicesearch 方法中,只有一个地方需要修改:**requet.source().query( ... )**其中的查询条件。

在之前的业务中,只有match 查询,根据关键字搜索, 现在要添加**条件过滤,**包括:

  • 品牌过滤:是keyword类型,用term查询
  • 星级过滤:是keyword类型,用term查询
  • 价格过滤:是数值类型,用range查询
  • 城市过滤:是keyword类型,用term查询

多个查询条件组合,肯定是boolean查询来组合:

  • 关键字搜索放到must中,参与算分
  • 其它过滤条件放到filter中,不参与算分

因为条件构建的逻辑比较复杂,这里先封装为一个函数:

buildBasicQuery的代码如下:

java 复制代码
private void buildBasicQuery(RequestParams params, SearchRequest request) {
    // 1.构建BooleanQuery
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    // 2.关键字搜索
    String key = params.getKey();
    if (key == null || "".equals(key)) {
        boolQuery.must(QueryBuilders.matchAllQuery());
    } else {
        boolQuery.must(QueryBuilders.matchQuery("all", key));
    }
    // 3.城市条件
    if (params.getCity() != null && !params.getCity().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("city", params.getCity()));
    }
    // 4.品牌条件
    if (params.getBrand() != null && !params.getBrand().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("brand", params.getBrand()));
    }
    // 5.星级条件
    if (params.getStarName() != null && !params.getStarName().equals("")) {
        boolQuery.filter(QueryBuilders.termQuery("starName", params.getStarName()));
    }
  // 6.价格
    if (params.getMinPrice() != null && params.getMaxPrice() != null) {
        boolQuery.filter(QueryBuilders
                         .rangeQuery("price")
                         .gte(params.getMinPrice())
                         .lte(params.getMaxPrice())
                        );
    }
  // 7.放入source
    request.source().query(boolQuery);
}
相关推荐
liuyunshengsir5 小时前
让 Elasticsearch Delete By Query 请求立即生效
大数据·elasticsearch·jenkins
不见长安在7 小时前
分布式ID
java·分布式·分布式id
qq_316837757 小时前
jmeter 分布式压测
分布式·jmeter
西岭千秋雪_9 小时前
Zookeeper实现分布式锁
java·分布式·后端·zookeeper·wpf
毕设源码-钟学长13 小时前
【开题答辩全过程】以 分布式菌菇销售系统为例,包含答辩的问题和答案
分布式
努力的小郑17 小时前
Elasticsearch 避坑指南:我在项目中总结的 14 条实用经验
后端·elasticsearch·性能优化
千禧皓月20 小时前
【C++】基于C++的RPC分布式网络通信框架(二)
c++·分布式·rpc
A.说学逗唱的Coke20 小时前
【观察者模式】深入 Spring 事件驱动模型:从入门到微服务整合实战
spring·观察者模式·微服务
杂家1 天前
Zookeeper完全分布式部署(超详细)
大数据·分布式·zookeeper
雨点保护雪花1 天前
15、RabbitMQ
分布式·rabbitmq