实战中关于elasticsearch中的查询方法--高级查询

因为最近要从elasticsearch中获取数据给前端展示,然后自己摸索到了一些查询方法,记录一下,以防忘记

只展示业务层的代码逻辑:

一、一次普通的查询方法:

 public ResultVO<List<PageVO<PageVulVo>>> page(PageParam param, @ResTypeValue String[] resTypeValues) {
        //排序
        if (StringUtils.isEmpty(param.getSortParams())) {
            param.setSortParams("first_time desc");
        }
        String sortParams = param.getSortParams();
        //搜索字段
//        Map<String, Object> map = ParamUtils.getMapBySearch(param);
        List<SearchParam> searchParams = param.getSearchParams();
        //查询条件
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
        this.queryVul(searchParams, nativeSearchQueryBuilder);
        //排序和分页
        PubUtils.sortAndPage(sortParams, nativeSearchQueryBuilder, param);
        //过滤
        nativeSearchQueryBuilder.withCollapseField("code");
        //查询
        Page<RealVul> pageResult = realVulRepository.search(nativeSearchQueryBuilder.build());
        //组装
        List<PageVulVo> pageVulVoList = pageResult.getContent().stream().map(e -> new PageVulVo(e)).collect(Collectors.toList());
        //返回
        return ResultUtils.pageOk(pageVulVoList, pageResult.getTotalElements());

    }

搜索条件方法:

  public NativeSearchQueryBuilder queryVul(List<SearchParam> searchParams, NativeSearchQueryBuilder nativeSearchQueryBuilder) {
        //查询条件
        BoolQueryBuilder mustQuery = QueryBuilders.boolQuery();

        for (SearchParam searchParam : searchParams) {
            String value = searchParam.getFieldValue();
            String name = searchParam.getFieldName();

            switch (name){
                case "vul_name":
                    mustQuery.must(QueryBuilders.wildcardQuery("vul_name", "*" + value + "*"));
                    break;
                case "cve_code":
                    mustQuery.must(QueryBuilders.matchQuery("cve_code", value));
                    break;
                case "port":
                    mustQuery.must(QueryBuilders.matchQuery("port",value));
                    break;
                case "scan_type":
                    mustQuery.must(QueryBuilders.matchQuery("scan_type",value));
                    break;
                case "create_time":
                    List<Long> createTime = DateUtils.parseStringToLong(value);
                    mustQuery.must(QueryBuilders.rangeQuery("create_time").gte(createTime.get(0)).lte(createTime.get(1)));
                    break;
                default:
                    break;
            }
        }
        nativeSearchQueryBuilder.withQuery(mustQuery);

        return nativeSearchQueryBuilder;
    }

分页和排序的方法:

 public static NativeSearchQueryBuilder sortAndPage(String sortParams, NativeSearchQueryBuilder nativeSearchQueryBuilder, PageParam param) {

        Pageable pageable = PageRequest.of(param.getCurrPage() - 1, param.getPageNums());
        nativeSearchQueryBuilder.withPageable(pageable);

        if (sortParams.toLowerCase().contains("desc")) {
            nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortParams.substring(0, sortParams.indexOf(" "))).order(SortOrder.DESC));
        } else {
            nativeSearchQueryBuilder.withSort(SortBuilders.fieldSort(sortParams.substring(0, sortParams.indexOf(" "))).order(SortOrder.ASC));
        }
        return nativeSearchQueryBuilder;
    }

这就是普通的查询办法。

二、带有统计和求最高级别的字段值

 例如要对整个elastcsearch中的数据进行统计分组和巧合的时候,上述的方法就不能满足要求了。

例如要算出以下这种数据

 

第一列是求出最高级别,第二

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值