实现基本搜索功能:关键字搜索 分类、品牌、价格过滤 排序分页高亮竞价排名

 表现层

    @PostMapping("/list")
    public PageDTO<ItemDoc> getlist(@RequestBody ParemDoc paremDoc){
        return searchService.geetlist(paremDoc);
    }

业务层

    @Override
    public PageDTO geetlist(ParemDoc paremDoc) {
        try {
            // 1.准备Request
            SearchRequest request = new SearchRequest("item");
            // 2.准备DSL
            // 2.1.query
            buildBasicQuery(paremDoc, request);
            // 2.2.分页
            int page = paremDoc.getPage();
            int size = paremDoc.getSize();
            request.source().from((page - 1) * size).size(size);
            //排序
            String sortBy = paremDoc.getSortBy();
            if ("sold".equals(sortBy)) {
               request.source().sort(sortBy, SortOrder.DESC);
            } else if ("price".equals(sortBy)) {
                request.source().sort(sortBy, SortOrder.ASC);
            }

            //高亮
            request.source().highlighter(new HighlightBuilder().field("name").requireFieldMatch(false));
            // 3.发送请求
            SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
            // 4.解析响应
            return handleResponse(response);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
handleResponse 方法块
 // 结果解析
    private PageDTO handleResponse(SearchResponse response) {
        // 4.解析响应
        SearchHits searchHits = response.getHits();
        // 4.1.获取总条数
        long total = searchHits.getTotalHits().value;
        // 4.2.文档数组
        SearchHit[] hits = searchHits.getHits();
        // 4.3.遍历
        List<ItemDoc> items = new ArrayList<>();
        for (SearchHit hit : hits) {
            // 获取文档source
            String json = hit.getSourceAsString();
            // 反序列化
            ItemDoc itemDoc = JSON.parseObject(json, ItemDoc.class);
            //获取高亮结果
            Map<String, HighlightField> highlightFields = hit.getHighlightFields();
            if (highlightFields !=null && highlightFields.size() >0){
                HighlightField name = highlightFields.get("name");
                String s = name.getFragments()[0].toString();
                itemDoc.setName(s);
            }
            // 放入集合
            items.add(itemDoc);
        }
        // 4.4.封装返回
        return new PageDTO(total, items);
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值