elasticsearch6.6版本 es填坑之路 解决:QueryBuilder同时使用should must时,会影响should的筛选结果!

如题,我们经常会使用es的组合查询时,用到must和should 分别对应sql语句里面的 and  和 or;

今天开发的时候,should单独使用的结果没问题,加上must发现should不起作用了。

先上错误的写法:

QueryBuilder termQueryBuilder = QueryBuilders.matchPhraseQuery("tablenamecn","*"+keyWords1 +"*"); //中文 包含的搜索,类似于sql中的 like "%keyword%" ,不分词的前提
QueryBuilder termQueryBuilder2 = QueryBuilders.wildcardQuery("tablename","*"+keyWords1 +"*"); //英文包含的搜素, 类似like 也不分词

上面2条 为 or的关系,满足其一即可;

下面的为must条件

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
   boolQueryBuilder.must(QueryBuilders.matchQuery("disabled", 0))
                  .must(QueryBuilders.matchQuery("tablestatus", 0))
                  .must(QueryBuilders.matchQuery("type", TABLE_TYPE));

然后我想当然的在下面加上了:

boolQueryBuilder.should(termQueryBuilder);
boolQueryBuilder.should(termQueryBuilder2);

结果should筛选压根不起作用了,全是must的结果。。。现修复如下:  

QueryBuilder query = QueryBuilders.boolQuery()
        .should(QueryBuilders.boolQuery()
                .filter(QueryBuilders.matchPhraseQuery("tablenamecn","*"+keyWords1 +"*")))
        .should(QueryBuilders.boolQuery()
                .filter(QueryBuilders.wildcardQuery("tablename","*"+keyWords1 +"*")));

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.must(QueryBuilders.matchQuery("disabled", 0))
                .must(QueryBuilders.matchQuery("tablestatus", 0))
                .must(QueryBuilders.matchQuery("type", TABLE_TYPE))
                .must(query);

结果正常!亲测可用

有问题下方评论,觉得好可以点赞!谢谢~~~

 

 

你可能感兴趣的:(elasticsearch)