二十七、微服务案例

目录

一、实现输入搜索功能

1、下载代码,在idea上打开

2、新建RequestParams类,用于接收解析请求

3、在启动类中加入客户端地址Bean,以便实现服务

4、编写搜索方法

5、新建返回分页结果类

6、实现搜索方法

7、编写控制类,接收请求

8、运行代码,测试功能

(1)检索功能

(2)分页功能

二、添加品牌、城市、星级、价格等过滤功能

1、修改RequestParams类

2、更改service类

3、启动并测试

三、实现排序功能

1、修改RequestParams类

2、在PageResult类中增加排序算法

3、修改HotelDoc类,增加Distance属性

4、修改解析JSON的方法

四、实现广告置顶功能

1、修改HotelDoc类,增加isAD属性

2、在service实现类中添加算分方法

3、运行测试


一、实现输入搜索功能

1、下载代码,在idea上打开

2、新建RequestParams类,用于接收解析请求

java 复制代码
@Data
public class RequestParams {
    private String key;
    private Integer page;
    private Integer size;
    private String sortBy;
}

3、在启动类中加入客户端地址Bean,以便实现服务

java 复制代码
@Bean
    public RestHighLevelClient client(){
        return new RestHighLevelClient(RestClient.builder(
                HttpHost.create("http://192.168.248.152:9200")
        ));
    }

4、编写搜索方法

java 复制代码
PageResult search(RequestParams params);

5、新建返回分页结果类

java 复制代码
@Data
public class PageResult {
    private long total;
    private List<HotelDoc> hotels;

    public PageResult() {
    }

    public PageResult(long total, List<HotelDoc> hotels) {
        this.total = total;
        this.hotels = hotels;
    }
}

6、实现搜索方法

java 复制代码
@Service
public class HotelService extends ServiceImpl<HotelMapper, Hotel> implements IHotelService {

    @Autowired
    private RestHighLevelClient client;

    @Override
    public PageResult search(RequestParams params) {
//      准备Request对象
        try {
            SearchRequest request = new SearchRequest("hotel");
            String key = params.getKey();
//      准备DSL
            if (key==null || "".equals(key)){
                request.source().query(QueryBuilders.matchAllQuery());
            }else {
                request.source().query(QueryBuilders.matchQuery("name", key));
            }
//        分页
            Integer page = params.getPage();
            Integer size = params.getSize();
            request.source().from((page-1)*size).size(size);
//      发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);

            return extracted(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    private PageResult extracted(SearchResponse response) {
//      解析响应
        SearchHits searchHits = response.getHits();
//      获取总条数
        long value = searchHits.getTotalHits().value;
        System.out.println("共搜索到" + value + "条数据!");
//      获取文档数组
        SearchHit[] hits = searchHits.getHits();
        ArrayList<HotelDoc> list = new ArrayList<>();
//      遍历
        for (SearchHit hit : hits) {
//          获取文档source
            String json = hit.getSourceAsString();
//          反序列化
            HotelDoc object = JSON.parseObject(json, HotelDoc.class);
            list.add(object);
//          获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (!CollectionUtils.isEmpty(highlightFields)){
//              根据字段名获取高亮结果
                HighlightField highlightField = highlightFields.get("name");
                if (highlightFields != null){
//                  获取高亮值
                    String name = highlightField.getFragments()[0].string();
//                  覆盖非高亮结果
                    object.setName(name);
                }
            }
//            System.out.println("object = " + object);
        }
        return new PageResult(value,list);
    }
}

7、编写控制类,接收请求

java 复制代码
@RestController
@RequestMapping("/hotel")
public class HotelController {

    @Autowired
    private IHotelService service;

    @PostMapping("/list")
    public PageResult search(@RequestBody RequestParams params){
        return service.search(params);
    }
}

8、运行代码,测试功能

(1)检索功能
(2)分页功能

二、添加品牌、城市、星级、价格等过滤功能

1、修改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 maxPrice;
    private Integer minPrice;
}

2、更改service类

java 复制代码
    @Override
    public PageResult search(RequestParams params) {
//       准备Request对象
        try {
            SearchRequest request = new SearchRequest("hotel");
            buildBasicQuery(params, request);
//        分页
            Integer page = params.getPage();
            Integer size = params.getSize();
            request.source().from((page-1)*size).size(size);
//      发送请求
            SearchResponse response = client.search(request, RequestOptions.DEFAULT);

            return extracted(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    private void buildBasicQuery(RequestParams params, SearchRequest request) {
        String key = params.getKey();
        BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
        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()));
        }
//       准备DSL
        request.source().query(boolQuery);
    }

3、启动并测试

三、实现排序功能

1、修改RequestParams类

java 复制代码
//          排序
            String location = params.getLocation();
            if (location != null && !location.equals("")){
                request.source().sort(SortBuilders.geoDistanceSort("location",new GeoPoint(location))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }

2、在PageResult类中增加排序算法

java 复制代码
            String location = params.getLocation();
            if (location != null && !location.equals("")){
                request.source().sort(SortBuilders.geoDistanceSort("location",new GeoPoint(location))
                        .order(SortOrder.ASC)
                        .unit(DistanceUnit.KILOMETERS));
            }

3、修改HotelDoc类,增加Distance属性

java 复制代码
   private Object distance;

4、修改解析JSON的方法

java 复制代码
//          获取排序值
            Object[] sortValues = hit.getSortValues();
            if (sortValues.length > 0){
                Object sortValue = sortValues[0];
                object.setDistance(sortValue);
            }

四、实现广告置顶功能

1、修改HotelDoc类,增加isAD属性

java 复制代码
    private Boolean isAD;

2、在service实现类中添加算分方法

java 复制代码
//        算分控制
        FunctionScoreQueryBuilder functionScoreQuery = QueryBuilders.functionScoreQuery(
                boolQuery,
                new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{
                        new FunctionScoreQueryBuilder.FilterFunctionBuilder(
                                QueryBuilders.termQuery("isAD","true"),//过滤条件
                                ScoreFunctionBuilders.weightFactorFunction(10) //分值*10
                        )
                });

3、运行测试

相关推荐
毕设源码-朱学姐39 分钟前
【开题答辩全过程】以 爱心捐赠网站为例,包含答辩的问题和答案
java·eclipse
楼田莉子3 小时前
Qt开发学习——QtCreator深度介绍/程序运行/开发规范/对象树
开发语言·前端·c++·qt·学习
尘觉3 小时前
中秋节与 Spring Boot 的思考:一场开箱即用的团圆盛宴
java·spring boot·后端
Le1Yu3 小时前
2025-10-7学习笔记
java·笔记·学习
韩立学长3 小时前
【开题答辩实录分享】以《基于python的奶茶店分布数据分析与可视化》为例进行答辩实录分享
开发语言·python·数据分析
popoxf3 小时前
spring容器启动流程(反射视角)
java·后端·spring
天若有情6733 小时前
C++空值初始化利器:empty.h使用指南
开发语言·c++
远远远远子3 小时前
类与对象 --1
开发语言·c++·算法
无敌最俊朗@4 小时前
C/C++ 关键关键字面试指南 (const, static, volatile, explicit)
c语言·开发语言·c++·面试
2401_831501734 小时前
Python学习之day03学习(文件和异常)
开发语言·python·学习