概念
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;
}