elasticsearch的should和must共用不生效(也就是说or条件查询无效)

博客介绍了bool(布尔)过滤器,它是复合过滤器,可将多个过滤器组合成布尔逻辑组合。其由must、must_not、should三部分组成,分别对应AND、NOT、OR逻辑。还提及Java中相关查询语句,以及should和must共用时should不生效的情况,并给出案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念 
bool (布尔)过滤器。 这是个 复合过滤器(compound filter) ,它可以接受多个其他过滤器作为参数,并将这些过滤器结合成各式各样的布尔(逻辑)组合。 
格式 
一个 bool 过滤器由三部分组成:

{
   "bool" : {
      "must" :     [],
      "should" :   [],
      "must_not" : [],
   }
}

must 
所有的语句都 必须(must) 匹配,与 AND 等价。 
must_not 
所有的语句都 不能(must not) 匹配,与 NOT 等价。 
should 
至少有一个语句要匹配,与 OR 等价。

java中and查询语句

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("content", "苹果"));

not查询语句

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.mustNot(QueryBuilders.termQuery("content", "苹果"));

or查询语句

BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.should(QueryBuilders.termQuery("content", "苹果"));

但是当should和must共用时should不生效

BoolQueryBuilder mustQuery = QueryBuilders.boolQuery();
BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery();

shouldQuery.should(QueryBuilders.termQuery("content", "苹果"));
mustQuery.must(QueryBuilders.matchQuery("title", "小米")).must(shouldQuery);//解决should和must共用不生效问题

案例:

// 构建基本查询条件
	private QueryBuilder buildBasicQueryWithFilter(SearchRequest request) {
		String flag = "";
		BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
		BoolQueryBuilder shouldQuery = QueryBuilders.boolQuery();
        // 基本查询条件
        //queryBuilder.must(QueryBuilders.matchQuery(request.getKeyField(), request.getKey()));
		//queryBuilder.must(QueryBuilders.multiMatchQuery(request.getKey(), request.getKeyFields()));//多字段查询,字段直接是or的关系
        //过滤条件
        Map<String, Object> filter = request.getFilter();
        if(filter != null) {
        	for (Map.Entry<String, Object> entry : filter.entrySet()) {
                String key = entry.getKey();
                flag = key;
                Map<String, String> value = (Map<String, String>) entry.getValue();
                	for (Map.Entry<String, String> map : value.entrySet()) {
                		String filterKey = map.getKey();
                		String filterValue = map.getValue();
                		if(key == "and") {
                			queryBuilder.filter(QueryBuilders.termQuery(filterKey, filterValue));
                		}
                		if(key == "or") {
                			shouldQuery.should(QueryBuilders.termQuery(filterKey, filterValue));
                		}
                		if(key == "not") {
                			queryBuilder.mustNot(QueryBuilders.termQuery(filterKey, filterValue));
                		}
                	}
            }
        }
        if(flag == "and" || flag == "not") {
        	queryBuilder.must(QueryBuilders.multiMatchQuery(request.getKey(), request.getKeyFields()));//多字段查询,字段直接是or的关系
        }else if(flag == "or") {
        	queryBuilder.must(QueryBuilders.multiMatchQuery(request.getKey(), request.getKeyFields())).must(shouldQuery);//解决should和must共用不生效问题
        }
		return queryBuilder;
	}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值