在elasticsearch中,我们使用比较多的还有这种布尔查询和布尔过滤器。这种主要是为了在组合查询或者复合查询的场景下使用的,整个bool查询或者布尔过滤器中,一定会出现must(必须满足)、should(应该满足)、must_not(不满足)这三个条件的至少一个。
bool查询的语法如下:
POST /{索引名}/_search { "query": { "bool": { // bool查询 "must": [], // must条件,类似SQL中的and, 代表必须匹配条件 "must_not": [], // must_not条件,跟must相反,必须不匹配条件 "should": [], // should条件,类似SQL中or, 代表匹配其中一个条件 "filter": [] // 不计算得分 } } }
关于Bool查询的特点是:
1、如果指定bool查询的某部分是must匹配,则只有匹配上这些查询的结果才会被返回。 2、如果指定了bool查询的某部分是should匹配,只有匹配上指定数量子句的文档才会被返回。 3、如果没有指定must匹配的子句,文档至少要匹配一个should子句才会被返回。 4、must_not子句会使匹配的文档被移出结果集。
关于这3个子句,我们也可以使用sql的方式理解一下.
must查询
可以理解成 select * from table where a = ? and b= ? and c= ?
should查询
可以理解成 select * from table where a=? or b = ? or c = ?
must_not查询
可以理解成 select * from table where a != ? and b != ? and c != ?
下面我们举个案例看一下,还是使用前面的test索引。
一、使用bool查询
post /test/_search { "query": { "bool": { "must": [{ "term": { "_id": 1 } }], "must_not": [{ "term": { "_id": 3 } }], "should": [{ "match": { "description": "doing" } }], "filter": [] } } }
从上面的案例可以看到具体的查询结果。
二、使用bool过滤器查询
使用过滤器的时候,我们和普通查询是一样的,只是根据上面的公式,在filter里面添加过滤条件即可,例如:
post /test/_search { "query": { "bool": { "must": [ { "match_all": {} } ], "filter": [ { "term": { "_id": 1 } } ] } } }
备注:
1、bool查询的话在日常工作中使用率非常高。
2、bool查询的时候可以看到must,must_not,should都是数组的形式,也就是这里可以传递多个匹配条件。
还没有评论,来说两句吧...