elasticsearch实战-复合查询(复杂sql的es转换实现)

 海量订单数据用搜索引擎来实现检索

 基础篇请查看这里

demo展示了bool查询构建的嵌套查询,涉及and/or/between/limit等

单纯的过滤建议使用filter方法,must也可以只不过性能略低(需要计算打分)。


    public PageResponse<List<OrderNewDto>> getOrderNewList(OrderQryReq searchOrgReq) {
        String keyword = searchOrgReq.getKeyword().toLowerCase();
        BoolQueryBuilder conditionQueryBuilder = QueryBuilders.boolQuery();
        //兼容空格输入多个关键字的检索
        Iterator<String> kws = Splitter.on(" ").split(keyword).iterator();
        while (kws.hasNext()) {
            String kw = kws.next().trim();
            BoolQueryBuilder keywordQueryBuilder = QueryBuilders.boolQuery();
            //构建关键字查询
            keywordQueryBuilder.should(QueryBuilders.prefixQuery("order_no", kw));
            keywordQueryBuilder.should(QueryBuilders.prefixQuery("order_code", kw));
            keywordQueryBuilder.should(QueryBuilders.termQuery("username.pinyin", kw));
            keywordQueryBuilder.should(QueryBuilders.prefixQuery("username.pinyin", kw));
            keywordQueryBuilder.should(QueryBuilders.termQuery("username.ik", kw));
            keywordQueryBuilder.should(QueryBuilders.prefixQuery("phone.keyword", kw));
            conditionQueryBuilder.must(keywordQueryBuilder);
        }
        conditionQueryBuilder.filter(QueryBuilders.termQuery("order_type", 1));
        //构建条件查询
        if (searchOrgReq.getCreateUserId() != null)
            conditionQueryBuilder.filter(QueryBuilders.termQuery("xiaosr_id", searchOrgReq.getCreateUserId()));
        if (searchOrgReq.getUserId() != null)
            conditionQueryBuilder.filter(QueryBuilders.termQuery("user_id", searchOrgReq.getUserId()));
        if (searchOrgReq.getOrderStatus() != null)
            conditionQueryBuilder.filter(QueryBuilders.termQuery("order_status", searchOrgReq.getOrderStatus()));
        if (searchOrgReq.getIsEnter() != null && searchOrgReq.getIsEnter() == 1)
            conditionQueryBuilder.filter(QueryBuilders.termQuery("payed_price", 0));
        if (searchOrgReq.getOrderStatus() != null)
            conditionQueryBuilder.filter(QueryBuilders.termQuery("order_status", searchOrgReq.getOrderStatus()));
        if (searchOrgReq.getStartTime() != null)
            conditionQueryBuilder.filter(QueryBuilders.rangeQuery("order_time").gte(LocalDateTime.parse(searchOrgReq.getStartTime(),
                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).minusHours(8).toString()));
        if (searchOrgReq.getEndTime() != null)
            conditionQueryBuilder.filter(QueryBuilders.rangeQuery("order_time").lte(LocalDateTime.parse(searchOrgReq.getEndTime(),
                    DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")).minusHours(8).toString()));

        NativeSearchQuery nativeSearchQuery = new NativeSearchQuery(StringUtils.isBlank(keyword) ? QueryBuilders.matchAllQuery() : conditionQueryBuilder);
        nativeSearchQuery.addIndices("order_new");
        nativeSearchQuery.addTypes("order");
        nativeSearchQuery.setPageable(PageRequest.of(searchOrgReq.getPage(), searchOrgReq.getPageSize()));
        nativeSearchQuery.addSort(Sort.by("order_time").descending());
        SearchHits searchHits = elasticsearchTemplate.query(nativeSearchQuery, SearchResponse::getHits);
        List<OrderNewDto> categories = new ArrayList<>();
        for (SearchHit searchHit : searchHits) {
            JSONObject jsonObject = new JSONObject(searchHit.getSourceAsMap());
            categories.add(jsonObject.toJavaObject(OrderNewDto.class));
        }
        return PageResponse.<List<OrderNewDto>>builder()
                .totalSize((int) searchHits.getTotalHits())
                .currentPage(searchOrgReq.getPage())
                .pageSize(searchOrgReq.getPageSize())
                .data(categories)
                .result(ResponseCodeEnum.SUCCESS.getCode())
                .build();
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值