Elasticsearch 同时使用should和must 只有must生效,java代码解决方案

ES中 同时使用should和must 导致只有must生效 解决方案

失效的原因就是must 和should在一起使用会不生效, 如果全部都是must是不影响的.

加入一个字段需要有类似 url =a or url =b 时, 我们就单独给他顶一个 BoolQueryBuilder urlQuery = boolQuery();
然后最后别忘了 mustQuery.must(urlQuery ); 即可 , 如果后续你的其他字段也需要should, 比如name 你可以再定一个BoolQueryBuilder nameQuery= boolQuery(),最后别忘了mustQuery.must(nameQuery)

 public NativeSearchQuery getCcNativeSearchQuery(UserLogRecordPo condition, PageParam pageParam) {
        Sort sortBy = Sort.by(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, pageParam.getSortCondition())).descending();

        if (StringUtils.equalsIgnoreCase("asc", pageParam.getSortModel())) {
            sortBy = sortBy.ascending();
        }
        Pageable pageable = PageRequest.of(pageParam.getPageNum() - 1, pageParam.getPageSize(), sortBy);

        if (StringUtils.isEmpty(pageParam.getSortCondition())) {
            pageParam.setSortCondition("requestTime");
        }
        NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();

        BoolQueryBuilder mustQuery = boolQuery();
        BoolQueryBuilder requestUrlShouldQuery = boolQuery();
        BoolQueryBuilder emailShouldQuery = boolQuery();
        if (StringUtils.isNotBlank(condition.getServerName())){
            mustQuery.must(
                    boolQuery().must(matchPhraseQuery("serverName.keyword", condition.getServerName()))
            );
        }
        if (condition.getStatus()!= null){
            mustQuery.must(
                    boolQuery().must(matchPhraseQuery("status", condition.getStatus()))
            );
        }

        if (StringUtils.isNotEmpty(condition.getRequestUrl())) {
            for (String requestUri : condition.getRequestUrl().split(",")) {
                requestUrlShouldQuery.should(matchPhraseQuery("requestUri", requestUri)
                );
            }
        } else {
            List<String> accOperateList = ProcessLogReceiver.accOperateList;
            for (String operator : accOperateList) {
                requestUrlShouldQuery.should(matchPhraseQuery("requestUri", operator));
            }
        }

        if (condition.getStartTime() != null && condition.getEndTime() != null) {
            mustQuery.must(
                    rangeQuery("requestTime")
                            .gte(condition.getStartTime())
                            .lt(condition.getEndTime())
            );
        }

        if (StringUtils.isNotBlank(condition.getIp())){
            mustQuery.must(matchPhraseQuery("ip",condition.getIp())
            );
        }
        if (StringUtils.isNotEmpty(condition.getEmail())) {
            for (String email : condition.getEmail().split(",")) {
                emailShouldQuery.should(matchPhraseQuery("email", email));
            }
        }

        if (StringUtils.isNotEmpty(condition.getParams())) {
            String params = condition.getParams();
            String[] paramArray = params.split(",");
            for (String param : paramArray) {
                mustQuery.must(matchPhraseQuery("params", param));
            }
        }


      


        mustQuery.must(requestUrlShouldQuery);
        mustQuery.must(emailShouldQuery);
        return  nativeSearchQueryBuilder.withQuery(mustQuery)
                                        .withPageable(pageable)
                                        .build();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值