如题,我们经常会使用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);
结果正常!亲测可用
有问题下方评论,觉得好可以点赞!谢谢~~~