以下是通过Java程序对 ES 进行多条件的过滤查询条件,有时候查询的条件是互相冲突,比如一个需要过滤field的值有以下三种情况:
1.Null
2.空字符串(“”)
3.0
但是我们在满足了Null的情况下无法再继续满足后面2个条件,因为判断一个Field是否为空,我们经常使用
QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery("remarks"));
但是用了mustNot之后就无法过滤其他条件了,所以我们可以通过 should(QueryBuilders.boolQuery() 这样的聚合查询方式来封装上面的方法,如下:
BoolQueryBuilder queryTotal = QueryBuilders.boolQuery();
if(StringUtils.isNotBlank(params.getRemarkFlag())){
if("1".equals(params.getRemarkFlag())){
queryTotal.filter(QueryBuilders.existsQuery("remarks"));
queryTotal.mustNot(QueryBuilders.termQuery("remarks",""));
queryTotal.mustNot(QueryBuilders.termQuery("remarks",0));
}else if("2".equals(params.getRemarkFlag())){
queryTotal.must(QueryBuilders.boolQuery()
.should(QueryBuilders.termQuery("remarks",0))
.should(QueryBuilders.termQuery("remarks",""))
.should(QueryBuilders.boolQuery()
.mustNot(QueryBuilders.existsQuery("remarks"))));
}
}
上面的代码中当RemarkFlag等于2时,其中就用了should(QueryBuilders.boolQuery()来封装mustNot(QueryBuilders.existsQuery("remarks"))这个方法,这样查询条件相当于
" remarks == 0 || remarks == "" || remarks == Null "